"use strict"; 'use strict'; (function(global, factory) { typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = global || self, factory(global.glMatrix = {})) } )(this, function(exports) { var EPSILON = 1E-6; var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; var RANDOM = Math.random; function setMatrixArrayType(type) { ARRAY_TYPE = type } var degree = Math.PI / 180; function toRadian(a) { return a * degree } function equals(a, b) { return Math.abs(a - b) <= EPSILON * Math.max(1, Math.abs(a), Math.abs(b)) } if (!Math.hypot) Math.hypot = function() { var y = 0 , i = arguments.length; while (i--) y += arguments[i] * arguments[i]; return Math.sqrt(y) } ; var common = Object.freeze({ __proto__: null, EPSILON: EPSILON, get ARRAY_TYPE() { return ARRAY_TYPE }, RANDOM: RANDOM, setMatrixArrayType: setMatrixArrayType, toRadian: toRadian, equals: equals }); function create() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0 } out[0] = 1; out[3] = 1; return out } function clone(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out } function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out } function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; return out } function fromValues(m00, m01, m10, m11) { var out = new ARRAY_TYPE(4); out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out } function set(out, m00, m01, m10, m11) { out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out } function transpose(out, a) { if (out === a) { var a1 = a[1]; out[1] = a[2]; out[2] = a1 } else { out[0] = a[0]; out[1] = a[2]; out[2] = a[1]; out[3] = a[3] } return out } function invert(out, a) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var det = a0 * a3 - a2 * a1; if (!det) return null; det = 1 / det; out[0] = a3 * det; out[1] = -a1 * det; out[2] = -a2 * det; out[3] = a0 * det; return out } function adjoint(out, a) { var a0 = a[0]; out[0] = a[3]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a0; return out } function determinant(a) { return a[0] * a[3] - a[2] * a[1] } function multiply(out, a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; return out } function rotate(out, a, rad) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; return out } function scale(out, a, v) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var v0 = v[0] , v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; return out } function fromRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; return out } function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; return out } function str(a) { return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")" } function frob(a) { return Math.hypot(a[0], a[1], a[2], a[3]) } function LDU(L, D, U, a) { L[2] = a[2] / a[0]; U[0] = a[0]; U[1] = a[1]; U[3] = a[3] - L[2] * U[1]; return [L, D, U] } function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out } function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out } function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] } function equals$1(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) } function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out } function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out } var mul = multiply; var sub = subtract; var mat2 = Object.freeze({ __proto__: null, create: create, clone: clone, copy: copy, identity: identity, fromValues: fromValues, set: set, transpose: transpose, invert: invert, adjoint: adjoint, determinant: determinant, multiply: multiply, rotate: rotate, scale: scale, fromRotation: fromRotation, fromScaling: fromScaling, str: str, frob: frob, LDU: LDU, add: add, subtract: subtract, exactEquals: exactEquals, equals: equals$1, multiplyScalar: multiplyScalar, multiplyScalarAndAdd: multiplyScalarAndAdd, mul: mul, sub: sub }); function create$1() { var out = new ARRAY_TYPE(6); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[4] = 0; out[5] = 0 } out[0] = 1; out[3] = 1; return out } function clone$1(a) { var out = new ARRAY_TYPE(6); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; return out } function copy$1(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; return out } function identity$1(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; return out } function fromValues$1(a, b, c, d, tx, ty) { var out = new ARRAY_TYPE(6); out[0] = a; out[1] = b; out[2] = c; out[3] = d; out[4] = tx; out[5] = ty; return out } function set$1(out, a, b, c, d, tx, ty) { out[0] = a; out[1] = b; out[2] = c; out[3] = d; out[4] = tx; out[5] = ty; return out } function invert$1(out, a) { var aa = a[0] , ab = a[1] , ac = a[2] , ad = a[3]; var atx = a[4] , aty = a[5]; var det = aa * ad - ab * ac; if (!det) return null; det = 1 / det; out[0] = ad * det; out[1] = -ab * det; out[2] = -ac * det; out[3] = aa * det; out[4] = (ac * aty - ad * atx) * det; out[5] = (ab * atx - aa * aty) * det; return out } function determinant$1(a) { return a[0] * a[3] - a[1] * a[2] } function multiply$1(out, a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3] , b4 = b[4] , b5 = b[5]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; out[4] = a0 * b4 + a2 * b5 + a4; out[5] = a1 * b4 + a3 * b5 + a5; return out } function rotate$1(out, a, rad) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; out[4] = a4; out[5] = a5; return out } function scale$1(out, a, v) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5]; var v0 = v[0] , v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; out[4] = a4; out[5] = a5; return out } function translate(out, a, v) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5]; var v0 = v[0] , v1 = v[1]; out[0] = a0; out[1] = a1; out[2] = a2; out[3] = a3; out[4] = a0 * v0 + a2 * v1 + a4; out[5] = a1 * v0 + a3 * v1 + a5; return out } function fromRotation$1(out, rad) { var s = Math.sin(rad) , c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; out[4] = 0; out[5] = 0; return out } function fromScaling$1(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; out[4] = 0; out[5] = 0; return out } function fromTranslation(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = v[0]; out[5] = v[1]; return out } function str$1(a) { return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")" } function frob$1(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1) } function add$1(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; return out } function subtract$1(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; return out } function multiplyScalar$1(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; return out } function multiplyScalarAndAdd$1(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; return out } function exactEquals$1(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] } function equals$2(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3] , b4 = b[4] , b5 = b[5]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) } var mul$1 = multiply$1; var sub$1 = subtract$1; var mat2d = Object.freeze({ __proto__: null, create: create$1, clone: clone$1, copy: copy$1, identity: identity$1, fromValues: fromValues$1, set: set$1, invert: invert$1, determinant: determinant$1, multiply: multiply$1, rotate: rotate$1, scale: scale$1, translate: translate, fromRotation: fromRotation$1, fromScaling: fromScaling$1, fromTranslation: fromTranslation, str: str$1, frob: frob$1, add: add$1, subtract: subtract$1, multiplyScalar: multiplyScalar$1, multiplyScalarAndAdd: multiplyScalarAndAdd$1, exactEquals: exactEquals$1, equals: equals$2, mul: mul$1, sub: sub$1 }); function create$2() { var out = new ARRAY_TYPE(9); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[5] = 0; out[6] = 0; out[7] = 0 } out[0] = 1; out[4] = 1; out[8] = 1; return out } function fromMat4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[4]; out[4] = a[5]; out[5] = a[6]; out[6] = a[8]; out[7] = a[9]; out[8] = a[10]; return out } function clone$2(a) { var out = new ARRAY_TYPE(9); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out } function copy$2(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out } function fromValues$2(m00, m01, m02, m10, m11, m12, m20, m21, m22) { var out = new ARRAY_TYPE(9); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out } function set$2(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m10; out[4] = m11; out[5] = m12; out[6] = m20; out[7] = m21; out[8] = m22; return out } function identity$2(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out } function transpose$1(out, a) { if (out === a) { var a01 = a[1] , a02 = a[2] , a12 = a[5]; out[1] = a[3]; out[2] = a[6]; out[3] = a01; out[5] = a[7]; out[6] = a02; out[7] = a12 } else { out[0] = a[0]; out[1] = a[3]; out[2] = a[6]; out[3] = a[1]; out[4] = a[4]; out[5] = a[7]; out[6] = a[2]; out[7] = a[5]; out[8] = a[8] } return out } function invert$2(out, a) { var a00 = a[0] , a01 = a[1] , a02 = a[2]; var a10 = a[3] , a11 = a[4] , a12 = a[5]; var a20 = a[6] , a21 = a[7] , a22 = a[8]; var b01 = a22 * a11 - a12 * a21; var b11 = -a22 * a10 + a12 * a20; var b21 = a21 * a10 - a11 * a20; var det = a00 * b01 + a01 * b11 + a02 * b21; if (!det) return null; det = 1 / det; out[0] = b01 * det; out[1] = (-a22 * a01 + a02 * a21) * det; out[2] = (a12 * a01 - a02 * a11) * det; out[3] = b11 * det; out[4] = (a22 * a00 - a02 * a20) * det; out[5] = (-a12 * a00 + a02 * a10) * det; out[6] = b21 * det; out[7] = (-a21 * a00 + a01 * a20) * det; out[8] = (a11 * a00 - a01 * a10) * det; return out } function adjoint$1(out, a) { var a00 = a[0] , a01 = a[1] , a02 = a[2]; var a10 = a[3] , a11 = a[4] , a12 = a[5]; var a20 = a[6] , a21 = a[7] , a22 = a[8]; out[0] = a11 * a22 - a12 * a21; out[1] = a02 * a21 - a01 * a22; out[2] = a01 * a12 - a02 * a11; out[3] = a12 * a20 - a10 * a22; out[4] = a00 * a22 - a02 * a20; out[5] = a02 * a10 - a00 * a12; out[6] = a10 * a21 - a11 * a20; out[7] = a01 * a20 - a00 * a21; out[8] = a00 * a11 - a01 * a10; return out } function determinant$2(a) { var a00 = a[0] , a01 = a[1] , a02 = a[2]; var a10 = a[3] , a11 = a[4] , a12 = a[5]; var a20 = a[6] , a21 = a[7] , a22 = a[8]; return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20) } function multiply$2(out, a, b) { var a00 = a[0] , a01 = a[1] , a02 = a[2]; var a10 = a[3] , a11 = a[4] , a12 = a[5]; var a20 = a[6] , a21 = a[7] , a22 = a[8]; var b00 = b[0] , b01 = b[1] , b02 = b[2]; var b10 = b[3] , b11 = b[4] , b12 = b[5]; var b20 = b[6] , b21 = b[7] , b22 = b[8]; out[0] = b00 * a00 + b01 * a10 + b02 * a20; out[1] = b00 * a01 + b01 * a11 + b02 * a21; out[2] = b00 * a02 + b01 * a12 + b02 * a22; out[3] = b10 * a00 + b11 * a10 + b12 * a20; out[4] = b10 * a01 + b11 * a11 + b12 * a21; out[5] = b10 * a02 + b11 * a12 + b12 * a22; out[6] = b20 * a00 + b21 * a10 + b22 * a20; out[7] = b20 * a01 + b21 * a11 + b22 * a21; out[8] = b20 * a02 + b21 * a12 + b22 * a22; return out } function translate$1(out, a, v) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a10 = a[3] , a11 = a[4] , a12 = a[5] , a20 = a[6] , a21 = a[7] , a22 = a[8] , x = v[0] , y = v[1]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a10; out[4] = a11; out[5] = a12; out[6] = x * a00 + y * a10 + a20; out[7] = x * a01 + y * a11 + a21; out[8] = x * a02 + y * a12 + a22; return out } function rotate$2(out, a, rad) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a10 = a[3] , a11 = a[4] , a12 = a[5] , a20 = a[6] , a21 = a[7] , a22 = a[8] , s = Math.sin(rad) , c = Math.cos(rad); out[0] = c * a00 + s * a10; out[1] = c * a01 + s * a11; out[2] = c * a02 + s * a12; out[3] = c * a10 - s * a00; out[4] = c * a11 - s * a01; out[5] = c * a12 - s * a02; out[6] = a20; out[7] = a21; out[8] = a22; return out } function scale$2(out, a, v) { var x = v[0] , y = v[1]; out[0] = x * a[0]; out[1] = x * a[1]; out[2] = x * a[2]; out[3] = y * a[3]; out[4] = y * a[4]; out[5] = y * a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; return out } function fromTranslation$1(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 1; out[5] = 0; out[6] = v[0]; out[7] = v[1]; out[8] = 1; return out } function fromRotation$2(out, rad) { var s = Math.sin(rad) , c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = -s; out[4] = c; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out } function fromScaling$2(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = v[1]; out[5] = 0; out[6] = 0; out[7] = 0; out[8] = 1; return out } function fromMat2d(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = 0; out[3] = a[2]; out[4] = a[3]; out[5] = 0; out[6] = a[4]; out[7] = a[5]; out[8] = 1; return out } function fromQuat(out, q) { var x = q[0] , y = q[1] , z = q[2] , w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[3] = yx - wz; out[6] = zx + wy; out[1] = yx + wz; out[4] = 1 - xx - zz; out[7] = zy - wx; out[2] = zx - wy; out[5] = zy + wx; out[8] = 1 - xx - yy; return out } function normalFromMat4(out, a) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a03 = a[3]; var a10 = a[4] , a11 = a[5] , a12 = a[6] , a13 = a[7]; var a20 = a[8] , a21 = a[9] , a22 = a[10] , a23 = a[11]; var a30 = a[12] , a31 = a[13] , a32 = a[14] , a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) return null; det = 1 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; return out } function projection(out, width, height) { out[0] = 2 / width; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = -2 / height; out[5] = 0; out[6] = -1; out[7] = 1; out[8] = 1; return out } function str$2(a) { return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")" } function frob$2(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) } function add$2(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; return out } function subtract$2(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; return out } function multiplyScalar$2(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; return out } function multiplyScalarAndAdd$2(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; return out } function exactEquals$2(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] } function equals$3(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5] , a6 = a[6] , a7 = a[7] , a8 = a[8]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3] , b4 = b[4] , b5 = b[5] , b6 = b[6] , b7 = b[7] , b8 = b[8]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1, Math.abs(a8), Math.abs(b8)) } var mul$2 = multiply$2; var sub$2 = subtract$2; var mat3 = Object.freeze({ __proto__: null, create: create$2, fromMat4: fromMat4, clone: clone$2, copy: copy$2, fromValues: fromValues$2, set: set$2, identity: identity$2, transpose: transpose$1, invert: invert$2, adjoint: adjoint$1, determinant: determinant$2, multiply: multiply$2, translate: translate$1, rotate: rotate$2, scale: scale$2, fromTranslation: fromTranslation$1, fromRotation: fromRotation$2, fromScaling: fromScaling$2, fromMat2d: fromMat2d, fromQuat: fromQuat, normalFromMat4: normalFromMat4, projection: projection, str: str$2, frob: frob$2, add: add$2, subtract: subtract$2, multiplyScalar: multiplyScalar$2, multiplyScalarAndAdd: multiplyScalarAndAdd$2, exactEquals: exactEquals$2, equals: equals$3, mul: mul$2, sub: sub$2 }); function create$3() { var out = new ARRAY_TYPE(16); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0 } out[0] = 1; out[5] = 1; out[10] = 1; out[15] = 1; return out } function clone$3(a) { var out = new ARRAY_TYPE(16); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out } function copy$3(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out } function fromValues$3(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { var out = new ARRAY_TYPE(16); out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out } function set$3(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { out[0] = m00; out[1] = m01; out[2] = m02; out[3] = m03; out[4] = m10; out[5] = m11; out[6] = m12; out[7] = m13; out[8] = m20; out[9] = m21; out[10] = m22; out[11] = m23; out[12] = m30; out[13] = m31; out[14] = m32; out[15] = m33; return out } function identity$3(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function transpose$2(out, a) { if (out === a) { var a01 = a[1] , a02 = a[2] , a03 = a[3]; var a12 = a[6] , a13 = a[7]; var a23 = a[11]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a01; out[6] = a[9]; out[7] = a[13]; out[8] = a02; out[9] = a12; out[11] = a[14]; out[12] = a03; out[13] = a13; out[14] = a23 } else { out[0] = a[0]; out[1] = a[4]; out[2] = a[8]; out[3] = a[12]; out[4] = a[1]; out[5] = a[5]; out[6] = a[9]; out[7] = a[13]; out[8] = a[2]; out[9] = a[6]; out[10] = a[10]; out[11] = a[14]; out[12] = a[3]; out[13] = a[7]; out[14] = a[11]; out[15] = a[15] } return out } function invert$3(out, a) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a03 = a[3]; var a10 = a[4] , a11 = a[5] , a12 = a[6] , a13 = a[7]; var a20 = a[8] , a21 = a[9] , a22 = a[10] , a23 = a[11]; var a30 = a[12] , a31 = a[13] , a32 = a[14] , a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; if (!det) return null; det = 1 / det; out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; return out } function adjoint$2(out, a) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a03 = a[3]; var a10 = a[4] , a11 = a[5] , a12 = a[6] , a13 = a[7]; var a20 = a[8] , a21 = a[9] , a22 = a[10] , a23 = a[11]; var a30 = a[12] , a31 = a[13] , a32 = a[14] , a33 = a[15]; out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); return out } function determinant$3(a) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a03 = a[3]; var a10 = a[4] , a11 = a[5] , a12 = a[6] , a13 = a[7]; var a20 = a[8] , a21 = a[9] , a22 = a[10] , a23 = a[11]; var a30 = a[12] , a31 = a[13] , a32 = a[14] , a33 = a[15]; var b00 = a00 * a11 - a01 * a10; var b01 = a00 * a12 - a02 * a10; var b02 = a00 * a13 - a03 * a10; var b03 = a01 * a12 - a02 * a11; var b04 = a01 * a13 - a03 * a11; var b05 = a02 * a13 - a03 * a12; var b06 = a20 * a31 - a21 * a30; var b07 = a20 * a32 - a22 * a30; var b08 = a20 * a33 - a23 * a30; var b09 = a21 * a32 - a22 * a31; var b10 = a21 * a33 - a23 * a31; var b11 = a22 * a33 - a23 * a32; return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06 } function multiply$3(out, a, b) { var a00 = a[0] , a01 = a[1] , a02 = a[2] , a03 = a[3]; var a10 = a[4] , a11 = a[5] , a12 = a[6] , a13 = a[7]; var a20 = a[8] , a21 = a[9] , a22 = a[10] , a23 = a[11]; var a30 = a[12] , a31 = a[13] , a32 = a[14] , a33 = a[15]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3]; out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; return out } function translate$2(out, a, v) { var x = v[0] , y = v[1] , z = v[2]; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; if (a === out) { out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; out[15] = a[3] * x + a[7] * y + a[11] * z + a[15] } else { a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; out[12] = a00 * x + a10 * y + a20 * z + a[12]; out[13] = a01 * x + a11 * y + a21 * z + a[13]; out[14] = a02 * x + a12 * y + a22 * z + a[14]; out[15] = a03 * x + a13 * y + a23 * z + a[15] } return out } function scale$3(out, a, v) { var x = v[0] , y = v[1] , z = v[2]; out[0] = a[0] * x; out[1] = a[1] * x; out[2] = a[2] * x; out[3] = a[3] * x; out[4] = a[4] * y; out[5] = a[5] * y; out[6] = a[6] * y; out[7] = a[7] * y; out[8] = a[8] * z; out[9] = a[9] * z; out[10] = a[10] * z; out[11] = a[11] * z; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15]; return out } function rotate$3(out, a, rad, axis) { var x = axis[0] , y = axis[1] , z = axis[2]; var len = Math.hypot(x, y, z); var s, c, t; var a00, a01, a02, a03; var a10, a11, a12, a13; var a20, a21, a22, a23; var b00, b01, b02; var b10, b11, b12; var b20, b21, b22; if (len < EPSILON) return null; len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s; b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s; b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c; out[0] = a00 * b00 + a10 * b01 + a20 * b02; out[1] = a01 * b00 + a11 * b01 + a21 * b02; out[2] = a02 * b00 + a12 * b01 + a22 * b02; out[3] = a03 * b00 + a13 * b01 + a23 * b02; out[4] = a00 * b10 + a10 * b11 + a20 * b12; out[5] = a01 * b10 + a11 * b11 + a21 * b12; out[6] = a02 * b10 + a12 * b11 + a22 * b12; out[7] = a03 * b10 + a13 * b11 + a23 * b12; out[8] = a00 * b20 + a10 * b21 + a20 * b22; out[9] = a01 * b20 + a11 * b21 + a21 * b22; out[10] = a02 * b20 + a12 * b21 + a22 * b22; out[11] = a03 * b20 + a13 * b21 + a23 * b22; if (a !== out) { out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15] } return out } function rotateX(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15] } out[4] = a10 * c + a20 * s; out[5] = a11 * c + a21 * s; out[6] = a12 * c + a22 * s; out[7] = a13 * c + a23 * s; out[8] = a20 * c - a10 * s; out[9] = a21 * c - a11 * s; out[10] = a22 * c - a12 * s; out[11] = a23 * c - a13 * s; return out } function rotateY(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a20 = a[8]; var a21 = a[9]; var a22 = a[10]; var a23 = a[11]; if (a !== out) { out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15] } out[0] = a00 * c - a20 * s; out[1] = a01 * c - a21 * s; out[2] = a02 * c - a22 * s; out[3] = a03 * c - a23 * s; out[8] = a00 * s + a20 * c; out[9] = a01 * s + a21 * c; out[10] = a02 * s + a22 * c; out[11] = a03 * s + a23 * c; return out } function rotateZ(out, a, rad) { var s = Math.sin(rad); var c = Math.cos(rad); var a00 = a[0]; var a01 = a[1]; var a02 = a[2]; var a03 = a[3]; var a10 = a[4]; var a11 = a[5]; var a12 = a[6]; var a13 = a[7]; if (a !== out) { out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11]; out[12] = a[12]; out[13] = a[13]; out[14] = a[14]; out[15] = a[15] } out[0] = a00 * c + a10 * s; out[1] = a01 * c + a11 * s; out[2] = a02 * c + a12 * s; out[3] = a03 * c + a13 * s; out[4] = a10 * c - a00 * s; out[5] = a11 * c - a01 * s; out[6] = a12 * c - a02 * s; out[7] = a13 * c - a03 * s; return out } function fromTranslation$2(out, v) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out } function fromScaling$3(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = v[1]; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = v[2]; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function fromRotation$3(out, rad, axis) { var x = axis[0] , y = axis[1] , z = axis[2]; var len = Math.hypot(x, y, z); var s, c, t; if (len < EPSILON) return null; len = 1 / len; x *= len; y *= len; z *= len; s = Math.sin(rad); c = Math.cos(rad); t = 1 - c; out[0] = x * x * t + c; out[1] = y * x * t + z * s; out[2] = z * x * t - y * s; out[3] = 0; out[4] = x * y * t - z * s; out[5] = y * y * t + c; out[6] = z * y * t + x * s; out[7] = 0; out[8] = x * z * t + y * s; out[9] = y * z * t - x * s; out[10] = z * z * t + c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function fromXRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = c; out[6] = s; out[7] = 0; out[8] = 0; out[9] = -s; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function fromYRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = 0; out[2] = -s; out[3] = 0; out[4] = 0; out[5] = 1; out[6] = 0; out[7] = 0; out[8] = s; out[9] = 0; out[10] = c; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function fromZRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = 0; out[3] = 0; out[4] = -s; out[5] = c; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 1; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function fromRotationTranslation(out, q, v) { var x = q[0] , y = q[1] , z = q[2] , w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - (yy + zz); out[1] = xy + wz; out[2] = xz - wy; out[3] = 0; out[4] = xy - wz; out[5] = 1 - (xx + zz); out[6] = yz + wx; out[7] = 0; out[8] = xz + wy; out[9] = yz - wx; out[10] = 1 - (xx + yy); out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out } function fromQuat2(out, a) { var translation = new ARRAY_TYPE(3); var bx = -a[0] , by = -a[1] , bz = -a[2] , bw = a[3] , ax = a[4] , ay = a[5] , az = a[6] , aw = a[7]; var magnitude = bx * bx + by * by + bz * bz + bw * bw; if (magnitude > 0) { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude } else { translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 } fromRotationTranslation(out, a, translation); return out } function getTranslation(out, mat) { out[0] = mat[12]; out[1] = mat[13]; out[2] = mat[14]; return out } function getScaling(out, mat) { var m11 = mat[0]; var m12 = mat[1]; var m13 = mat[2]; var m21 = mat[4]; var m22 = mat[5]; var m23 = mat[6]; var m31 = mat[8]; var m32 = mat[9]; var m33 = mat[10]; out[0] = Math.hypot(m11, m12, m13); out[1] = Math.hypot(m21, m22, m23); out[2] = Math.hypot(m31, m32, m33); return out } function getRotation(out, mat) { var scaling = new ARRAY_TYPE(3); getScaling(scaling, mat); var is1 = 1 / scaling[0]; var is2 = 1 / scaling[1]; var is3 = 1 / scaling[2]; var sm11 = mat[0] * is1; var sm12 = mat[1] * is2; var sm13 = mat[2] * is3; var sm21 = mat[4] * is1; var sm22 = mat[5] * is2; var sm23 = mat[6] * is3; var sm31 = mat[8] * is1; var sm32 = mat[9] * is2; var sm33 = mat[10] * is3; var trace = sm11 + sm22 + sm33; var S = 0; if (trace > 0) { S = Math.sqrt(trace + 1) * 2; out[3] = .25 * S; out[0] = (sm23 - sm32) / S; out[1] = (sm31 - sm13) / S; out[2] = (sm12 - sm21) / S } else if (sm11 > sm22 && sm11 > sm33) { S = Math.sqrt(1 + sm11 - sm22 - sm33) * 2; out[3] = (sm23 - sm32) / S; out[0] = .25 * S; out[1] = (sm12 + sm21) / S; out[2] = (sm31 + sm13) / S } else if (sm22 > sm33) { S = Math.sqrt(1 + sm22 - sm11 - sm33) * 2; out[3] = (sm31 - sm13) / S; out[0] = (sm12 + sm21) / S; out[1] = .25 * S; out[2] = (sm23 + sm32) / S } else { S = Math.sqrt(1 + sm33 - sm11 - sm22) * 2; out[3] = (sm12 - sm21) / S; out[0] = (sm31 + sm13) / S; out[1] = (sm23 + sm32) / S; out[2] = .25 * S } return out } function fromRotationTranslationScale(out, q, v, s) { var x = q[0] , y = q[1] , z = q[2] , w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; out[0] = (1 - (yy + zz)) * sx; out[1] = (xy + wz) * sx; out[2] = (xz - wy) * sx; out[3] = 0; out[4] = (xy - wz) * sy; out[5] = (1 - (xx + zz)) * sy; out[6] = (yz + wx) * sy; out[7] = 0; out[8] = (xz + wy) * sz; out[9] = (yz - wx) * sz; out[10] = (1 - (xx + yy)) * sz; out[11] = 0; out[12] = v[0]; out[13] = v[1]; out[14] = v[2]; out[15] = 1; return out } function fromRotationTranslationScaleOrigin(out, q, v, s, o) { var x = q[0] , y = q[1] , z = q[2] , w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var xy = x * y2; var xz = x * z2; var yy = y * y2; var yz = y * z2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; var sx = s[0]; var sy = s[1]; var sz = s[2]; var ox = o[0]; var oy = o[1]; var oz = o[2]; var out0 = (1 - (yy + zz)) * sx; var out1 = (xy + wz) * sx; var out2 = (xz - wy) * sx; var out4 = (xy - wz) * sy; var out5 = (1 - (xx + zz)) * sy; var out6 = (yz + wx) * sy; var out8 = (xz + wy) * sz; var out9 = (yz - wx) * sz; var out10 = (1 - (xx + yy)) * sz; out[0] = out0; out[1] = out1; out[2] = out2; out[3] = 0; out[4] = out4; out[5] = out5; out[6] = out6; out[7] = 0; out[8] = out8; out[9] = out9; out[10] = out10; out[11] = 0; out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); out[15] = 1; return out } function fromQuat$1(out, q) { var x = q[0] , y = q[1] , z = q[2] , w = q[3]; var x2 = x + x; var y2 = y + y; var z2 = z + z; var xx = x * x2; var yx = y * x2; var yy = y * y2; var zx = z * x2; var zy = z * y2; var zz = z * z2; var wx = w * x2; var wy = w * y2; var wz = w * z2; out[0] = 1 - yy - zz; out[1] = yx + wz; out[2] = zx - wy; out[3] = 0; out[4] = yx - wz; out[5] = 1 - xx - zz; out[6] = zy + wx; out[7] = 0; out[8] = zx + wy; out[9] = zy - wx; out[10] = 1 - xx - yy; out[11] = 0; out[12] = 0; out[13] = 0; out[14] = 0; out[15] = 1; return out } function frustum(out, left, right, bottom, top, near, far) { var rl = 1 / (right - left); var tb = 1 / (top - bottom); var nf = 1 / (near - far); out[0] = near * 2 * rl; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = near * 2 * tb; out[6] = 0; out[7] = 0; out[8] = (right + left) * rl; out[9] = (top + bottom) * tb; out[10] = (far + near) * nf; out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near * 2 * nf; out[15] = 0; return out } function perspective(out, fovy, aspect, near, far) { var f = 1 / Math.tan(fovy / 2), nf; out[0] = f / aspect; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = f; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[11] = -1; out[12] = 0; out[13] = 0; out[15] = 0; if (far != null && far !== Infinity) { nf = 1 / (near - far); out[10] = (far + near) * nf; out[14] = 2 * far * near * nf } else { out[10] = -1; out[14] = -2 * near } return out } function perspectiveFromFieldOfView(out, fov, near, far) { var upTan = Math.tan(fov.upDegrees * Math.PI / 180); var downTan = Math.tan(fov.downDegrees * Math.PI / 180); var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180); var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180); var xScale = 2 / (leftTan + rightTan); var yScale = 2 / (upTan + downTan); out[0] = xScale; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = yScale; out[6] = 0; out[7] = 0; out[8] = -((leftTan - rightTan) * xScale * .5); out[9] = (upTan - downTan) * yScale * .5; out[10] = far / (near - far); out[11] = -1; out[12] = 0; out[13] = 0; out[14] = far * near / (near - far); out[15] = 0; return out } function ortho(out, left, right, bottom, top, near, far) { var lr = 1 / (left - right); var bt = 1 / (bottom - top); var nf = 1 / (near - far); out[0] = -2 * lr; out[1] = 0; out[2] = 0; out[3] = 0; out[4] = 0; out[5] = -2 * bt; out[6] = 0; out[7] = 0; out[8] = 0; out[9] = 0; out[10] = 2 * nf; out[11] = 0; out[12] = (left + right) * lr; out[13] = (top + bottom) * bt; out[14] = (far + near) * nf; out[15] = 1; return out } function lookAt(out, eye, center, up) { var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; var eyex = eye[0]; var eyey = eye[1]; var eyez = eye[2]; var upx = up[0]; var upy = up[1]; var upz = up[2]; var centerx = center[0]; var centery = center[1]; var centerz = center[2]; if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) return identity$3(out); z0 = eyex - centerx; z1 = eyey - centery; z2 = eyez - centerz; len = 1 / Math.hypot(z0, z1, z2); z0 *= len; z1 *= len; z2 *= len; x0 = upy * z2 - upz * z1; x1 = upz * z0 - upx * z2; x2 = upx * z1 - upy * z0; len = Math.hypot(x0, x1, x2); if (!len) { x0 = 0; x1 = 0; x2 = 0 } else { len = 1 / len; x0 *= len; x1 *= len; x2 *= len } y0 = z1 * x2 - z2 * x1; y1 = z2 * x0 - z0 * x2; y2 = z0 * x1 - z1 * x0; len = Math.hypot(y0, y1, y2); if (!len) { y0 = 0; y1 = 0; y2 = 0 } else { len = 1 / len; y0 *= len; y1 *= len; y2 *= len } out[0] = x0; out[1] = y0; out[2] = z0; out[3] = 0; out[4] = x1; out[5] = y1; out[6] = z1; out[7] = 0; out[8] = x2; out[9] = y2; out[10] = z2; out[11] = 0; out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); out[15] = 1; return out } function targetTo(out, eye, target, up) { var eyex = eye[0] , eyey = eye[1] , eyez = eye[2] , upx = up[0] , upy = up[1] , upz = up[2]; var z0 = eyex - target[0] , z1 = eyey - target[1] , z2 = eyez - target[2]; var len = z0 * z0 + z1 * z1 + z2 * z2; if (len > 0) { len = 1 / Math.sqrt(len); z0 *= len; z1 *= len; z2 *= len } var x0 = upy * z2 - upz * z1 , x1 = upz * z0 - upx * z2 , x2 = upx * z1 - upy * z0; len = x0 * x0 + x1 * x1 + x2 * x2; if (len > 0) { len = 1 / Math.sqrt(len); x0 *= len; x1 *= len; x2 *= len } out[0] = x0; out[1] = x1; out[2] = x2; out[3] = 0; out[4] = z1 * x2 - z2 * x1; out[5] = z2 * x0 - z0 * x2; out[6] = z0 * x1 - z1 * x0; out[7] = 0; out[8] = z0; out[9] = z1; out[10] = z2; out[11] = 0; out[12] = eyex; out[13] = eyey; out[14] = eyez; out[15] = 1; return out } function str$3(a) { return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")" } function frob$3(a) { return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) } function add$3(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; out[8] = a[8] + b[8]; out[9] = a[9] + b[9]; out[10] = a[10] + b[10]; out[11] = a[11] + b[11]; out[12] = a[12] + b[12]; out[13] = a[13] + b[13]; out[14] = a[14] + b[14]; out[15] = a[15] + b[15]; return out } function subtract$3(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; out[4] = a[4] - b[4]; out[5] = a[5] - b[5]; out[6] = a[6] - b[6]; out[7] = a[7] - b[7]; out[8] = a[8] - b[8]; out[9] = a[9] - b[9]; out[10] = a[10] - b[10]; out[11] = a[11] - b[11]; out[12] = a[12] - b[12]; out[13] = a[13] - b[13]; out[14] = a[14] - b[14]; out[15] = a[15] - b[15]; return out } function multiplyScalar$3(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; out[8] = a[8] * b; out[9] = a[9] * b; out[10] = a[10] * b; out[11] = a[11] * b; out[12] = a[12] * b; out[13] = a[13] * b; out[14] = a[14] * b; out[15] = a[15] * b; return out } function multiplyScalarAndAdd$3(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; out[4] = a[4] + b[4] * scale; out[5] = a[5] + b[5] * scale; out[6] = a[6] + b[6] * scale; out[7] = a[7] + b[7] * scale; out[8] = a[8] + b[8] * scale; out[9] = a[9] + b[9] * scale; out[10] = a[10] + b[10] * scale; out[11] = a[11] + b[11] * scale; out[12] = a[12] + b[12] * scale; out[13] = a[13] + b[13] * scale; out[14] = a[14] + b[14] * scale; out[15] = a[15] + b[15] * scale; return out } function exactEquals$3(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15] } function equals$4(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var a4 = a[4] , a5 = a[5] , a6 = a[6] , a7 = a[7]; var a8 = a[8] , a9 = a[9] , a10 = a[10] , a11 = a[11]; var a12 = a[12] , a13 = a[13] , a14 = a[14] , a15 = a[15]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3]; var b4 = b[4] , b5 = b[5] , b6 = b[6] , b7 = b[7]; var b8 = b[8] , b9 = b[9] , b10 = b[10] , b11 = b[11]; var b12 = b[12] , b13 = b[13] , b14 = b[14] , b15 = b[15]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1, Math.abs(a15), Math.abs(b15)) } var mul$3 = multiply$3; var sub$3 = subtract$3; var mat4 = Object.freeze({ __proto__: null, create: create$3, clone: clone$3, copy: copy$3, fromValues: fromValues$3, set: set$3, identity: identity$3, transpose: transpose$2, invert: invert$3, adjoint: adjoint$2, determinant: determinant$3, multiply: multiply$3, translate: translate$2, scale: scale$3, rotate: rotate$3, rotateX: rotateX, rotateY: rotateY, rotateZ: rotateZ, fromTranslation: fromTranslation$2, fromScaling: fromScaling$3, fromRotation: fromRotation$3, fromXRotation: fromXRotation, fromYRotation: fromYRotation, fromZRotation: fromZRotation, fromRotationTranslation: fromRotationTranslation, fromQuat2: fromQuat2, getTranslation: getTranslation, getScaling: getScaling, getRotation: getRotation, fromRotationTranslationScale: fromRotationTranslationScale, fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin, fromQuat: fromQuat$1, frustum: frustum, perspective: perspective, perspectiveFromFieldOfView: perspectiveFromFieldOfView, ortho: ortho, lookAt: lookAt, targetTo: targetTo, str: str$3, frob: frob$3, add: add$3, subtract: subtract$3, multiplyScalar: multiplyScalar$3, multiplyScalarAndAdd: multiplyScalarAndAdd$3, exactEquals: exactEquals$3, equals: equals$4, mul: mul$3, sub: sub$3 }); function create$4() { var out = new ARRAY_TYPE(3); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0 } return out } function clone$4(a) { var out = new ARRAY_TYPE(3); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out } function length(a) { var x = a[0]; var y = a[1]; var z = a[2]; return Math.hypot(x, y, z) } function fromValues$4(x, y, z) { var out = new ARRAY_TYPE(3); out[0] = x; out[1] = y; out[2] = z; return out } function copy$4(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out } function set$4(out, x, y, z) { out[0] = x; out[1] = y; out[2] = z; return out } function add$4(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; return out } function subtract$4(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; return out } function multiply$4(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; return out } function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; return out } function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); return out } function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); return out } function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); return out } function max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); return out } function round(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); return out } function scale$4(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; return out } function scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; return out } function distance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return Math.hypot(x, y, z) } function squaredDistance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return x * x + y * y + z * z } function squaredLength(a) { var x = a[0]; var y = a[1]; var z = a[2]; return x * x + y * y + z * z } function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; return out } function inverse(out, a) { out[0] = 1 / a[0]; out[1] = 1 / a[1]; out[2] = 1 / a[2]; return out } function normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; if (len > 0) len = 1 / Math.sqrt(len); out[0] = a[0] * len; out[1] = a[1] * len; out[2] = a[2] * len; return out } function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] } function cross(out, a, b) { var ax = a[0] , ay = a[1] , az = a[2]; var bx = b[0] , by = b[1] , bz = b[2]; out[0] = ay * bz - az * by; out[1] = az * bx - ax * bz; out[2] = ax * by - ay * bx; return out } function lerp(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); return out } function hermite(out, a, b, c, d, t) { var factorTimes2 = t * t; var factor1 = factorTimes2 * (2 * t - 3) + 1; var factor2 = factorTimes2 * (t - 2) + t; var factor3 = factorTimes2 * (t - 1); var factor4 = factorTimes2 * (3 - 2 * t); out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out } function bezier(out, a, b, c, d, t) { var inverseFactor = 1 - t; var inverseFactorTimesTwo = inverseFactor * inverseFactor; var factorTimes2 = t * t; var factor1 = inverseFactorTimesTwo * inverseFactor; var factor2 = 3 * t * inverseFactorTimesTwo; var factor3 = 3 * factorTimes2 * inverseFactor; var factor4 = factorTimes2 * t; out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out } function random(out, scale) { scale = scale || 1; var r = RANDOM() * 2 * Math.PI; var z = RANDOM() * 2 - 1; var zScale = Math.sqrt(1 - z * z) * scale; out[0] = Math.cos(r) * zScale; out[1] = Math.sin(r) * zScale; out[2] = z * scale; return out } function transformMat4(out, a, m) { var x = a[0] , y = a[1] , z = a[2]; var w = m[3] * x + m[7] * y + m[11] * z + m[15]; w = w || 1; out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; return out } function transformMat3(out, a, m) { var x = a[0] , y = a[1] , z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out } function transformQuat(out, a, q) { var qx = q[0] , qy = q[1] , qz = q[2] , qw = q[3]; var x = a[0] , y = a[1] , z = a[2]; var uvx = qy * z - qz * y , uvy = qz * x - qx * z , uvz = qx * y - qy * x; var uuvx = qy * uvz - qz * uvy , uuvy = qz * uvx - qx * uvz , uuvz = qx * uvy - qy * uvx; var w2 = qw * 2; uvx *= w2; uvy *= w2; uvz *= w2; uuvx *= 2; uuvy *= 2; uuvz *= 2; out[0] = x + uvx + uuvx; out[1] = y + uvy + uuvy; out[2] = z + uvz + uuvz; return out } function rotateX$1(out, a, b, rad) { var p = [] , r = []; p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; r[0] = p[0]; r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out } function rotateY$1(out, a, b, rad) { var p = [] , r = []; p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); r[1] = p[1]; r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out } function rotateZ$1(out, a, b, rad) { var p = [] , r = []; p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); r[2] = p[2]; out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out } function angle(a, b) { var ax = a[0] , ay = a[1] , az = a[2] , bx = b[0] , by = b[1] , bz = b[2] , mag1 = Math.sqrt(ax * ax + ay * ay + az * az) , mag2 = Math.sqrt(bx * bx + by * by + bz * bz) , mag = mag1 * mag2 , cosine = mag && dot(a, b) / mag; return Math.acos(Math.min(Math.max(cosine, -1), 1)) } function zero(out) { out[0] = 0; out[1] = 0; out[2] = 0; return out } function str$4(a) { return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")" } function exactEquals$4(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] } function equals$5(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2]; var b0 = b[0] , b1 = b[1] , b2 = b[2]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) } var sub$4 = subtract$4; var mul$4 = multiply$4; var div = divide; var dist = distance; var sqrDist = squaredDistance; var len = length; var sqrLen = squaredLength; var forEach = function() { var vec = create$4(); return function(a, stride, offset, count, fn, arg) { var i, l; if (!stride) stride = 3; if (!offset) offset = 0; if (count) l = Math.min(count * stride + offset, a.length); else l = a.length; for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2] } return a } }(); var vec3 = Object.freeze({ __proto__: null, create: create$4, clone: clone$4, length: length, fromValues: fromValues$4, copy: copy$4, set: set$4, add: add$4, subtract: subtract$4, multiply: multiply$4, divide: divide, ceil: ceil, floor: floor, min: min, max: max, round: round, scale: scale$4, scaleAndAdd: scaleAndAdd, distance: distance, squaredDistance: squaredDistance, squaredLength: squaredLength, negate: negate, inverse: inverse, normalize: normalize, dot: dot, cross: cross, lerp: lerp, hermite: hermite, bezier: bezier, random: random, transformMat4: transformMat4, transformMat3: transformMat3, transformQuat: transformQuat, rotateX: rotateX$1, rotateY: rotateY$1, rotateZ: rotateZ$1, angle: angle, zero: zero, str: str$4, exactEquals: exactEquals$4, equals: equals$5, sub: sub$4, mul: mul$4, div: div, dist: dist, sqrDist: sqrDist, len: len, sqrLen: sqrLen, forEach: forEach }); function create$5() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0 } return out } function clone$5(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out } function fromValues$5(x, y, z, w) { var out = new ARRAY_TYPE(4); out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out } function copy$5(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out } function set$5(out, x, y, z, w) { out[0] = x; out[1] = y; out[2] = z; out[3] = w; return out } function add$5(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out } function subtract$5(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out } function multiply$5(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; out[3] = a[3] * b[3]; return out } function divide$1(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; out[3] = a[3] / b[3]; return out } function ceil$1(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); out[3] = Math.ceil(a[3]); return out } function floor$1(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); out[3] = Math.floor(a[3]); return out } function min$1(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); out[3] = Math.min(a[3], b[3]); return out } function max$1(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); out[3] = Math.max(a[3], b[3]); return out } function round$1(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); out[2] = Math.round(a[2]); out[3] = Math.round(a[3]); return out } function scale$5(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out } function scaleAndAdd$1(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out } function distance$1(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; var w = b[3] - a[3]; return Math.hypot(x, y, z, w) } function squaredDistance$1(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; var w = b[3] - a[3]; return x * x + y * y + z * z + w * w } function length$1(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return Math.hypot(x, y, z, w) } function squaredLength$1(a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; return x * x + y * y + z * z + w * w } function negate$1(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = -a[3]; return out } function inverse$1(out, a) { out[0] = 1 / a[0]; out[1] = 1 / a[1]; out[2] = 1 / a[2]; out[3] = 1 / a[3]; return out } function normalize$1(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var w = a[3]; var len = x * x + y * y + z * z + w * w; if (len > 0) len = 1 / Math.sqrt(len); out[0] = x * len; out[1] = y * len; out[2] = z * len; out[3] = w * len; return out } function dot$1(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] } function cross$1(out, u, v, w) { var A = v[0] * w[1] - v[1] * w[0] , B = v[0] * w[2] - v[2] * w[0] , C = v[0] * w[3] - v[3] * w[0] , D = v[1] * w[2] - v[2] * w[1] , E = v[1] * w[3] - v[3] * w[1] , F = v[2] * w[3] - v[3] * w[2]; var G = u[0]; var H = u[1]; var I = u[2]; var J = u[3]; out[0] = H * F - I * E + J * D; out[1] = -(G * F) + I * C - J * B; out[2] = G * E - H * C + J * A; out[3] = -(G * D) + H * B - I * A; return out } function lerp$1(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; var aw = a[3]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); out[3] = aw + t * (b[3] - aw); return out } function random$1(out, scale) { scale = scale || 1; var v1, v2, v3, v4; var s1, s2; do { v1 = RANDOM() * 2 - 1; v2 = RANDOM() * 2 - 1; s1 = v1 * v1 + v2 * v2 } while (s1 >= 1); do { v3 = RANDOM() * 2 - 1; v4 = RANDOM() * 2 - 1; s2 = v3 * v3 + v4 * v4 } while (s2 >= 1); var d = Math.sqrt((1 - s1) / s2); out[0] = scale * v1; out[1] = scale * v2; out[2] = scale * v3 * d; out[3] = scale * v4 * d; return out } function transformMat4$1(out, a, m) { var x = a[0] , y = a[1] , z = a[2] , w = a[3]; out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; return out } function transformQuat$1(out, a, q) { var x = a[0] , y = a[1] , z = a[2]; var qx = q[0] , qy = q[1] , qz = q[2] , qw = q[3]; var ix = qw * x + qy * z - qz * y; var iy = qw * y + qz * x - qx * z; var iz = qw * z + qx * y - qy * x; var iw = -qx * x - qy * y - qz * z; out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; out[3] = a[3]; return out } function zero$1(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 0; return out } function str$5(a) { return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")" } function exactEquals$5(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] } function equals$6(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) } var sub$5 = subtract$5; var mul$5 = multiply$5; var div$1 = divide$1; var dist$1 = distance$1; var sqrDist$1 = squaredDistance$1; var len$1 = length$1; var sqrLen$1 = squaredLength$1; var forEach$1 = function() { var vec = create$5(); return function(a, stride, offset, count, fn, arg) { var i, l; if (!stride) stride = 4; if (!offset) offset = 0; if (count) l = Math.min(count * stride + offset, a.length); else l = a.length; for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; vec[3] = a[i + 3]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; a[i + 3] = vec[3] } return a } }(); var vec4 = Object.freeze({ __proto__: null, create: create$5, clone: clone$5, fromValues: fromValues$5, copy: copy$5, set: set$5, add: add$5, subtract: subtract$5, multiply: multiply$5, divide: divide$1, ceil: ceil$1, floor: floor$1, min: min$1, max: max$1, round: round$1, scale: scale$5, scaleAndAdd: scaleAndAdd$1, distance: distance$1, squaredDistance: squaredDistance$1, length: length$1, squaredLength: squaredLength$1, negate: negate$1, inverse: inverse$1, normalize: normalize$1, dot: dot$1, cross: cross$1, lerp: lerp$1, random: random$1, transformMat4: transformMat4$1, transformQuat: transformQuat$1, zero: zero$1, str: str$5, exactEquals: exactEquals$5, equals: equals$6, sub: sub$5, mul: mul$5, div: div$1, dist: dist$1, sqrDist: sqrDist$1, len: len$1, sqrLen: sqrLen$1, forEach: forEach$1 }); function create$6() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0 } out[3] = 1; return out } function identity$4(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out } function setAxisAngle(out, axis, rad) { rad = rad * .5; var s = Math.sin(rad); out[0] = s * axis[0]; out[1] = s * axis[1]; out[2] = s * axis[2]; out[3] = Math.cos(rad); return out } function getAxisAngle(out_axis, q) { var rad = Math.acos(q[3]) * 2; var s = Math.sin(rad / 2); if (s > EPSILON) { out_axis[0] = q[0] / s; out_axis[1] = q[1] / s; out_axis[2] = q[2] / s } else { out_axis[0] = 1; out_axis[1] = 0; out_axis[2] = 0 } return rad } function getAngle(a, b) { var dotproduct = dot$2(a, b); return Math.acos(2 * dotproduct * dotproduct - 1) } function multiply$6(out, a, b) { var ax = a[0] , ay = a[1] , az = a[2] , aw = a[3]; var bx = b[0] , by = b[1] , bz = b[2] , bw = b[3]; out[0] = ax * bw + aw * bx + ay * bz - az * by; out[1] = ay * bw + aw * by + az * bx - ax * bz; out[2] = az * bw + aw * bz + ax * by - ay * bx; out[3] = aw * bw - ax * bx - ay * by - az * bz; return out } function rotateX$2(out, a, rad) { rad *= .5; var ax = a[0] , ay = a[1] , az = a[2] , aw = a[3]; var bx = Math.sin(rad) , bw = Math.cos(rad); out[0] = ax * bw + aw * bx; out[1] = ay * bw + az * bx; out[2] = az * bw - ay * bx; out[3] = aw * bw - ax * bx; return out } function rotateY$2(out, a, rad) { rad *= .5; var ax = a[0] , ay = a[1] , az = a[2] , aw = a[3]; var by = Math.sin(rad) , bw = Math.cos(rad); out[0] = ax * bw - az * by; out[1] = ay * bw + aw * by; out[2] = az * bw + ax * by; out[3] = aw * bw - ay * by; return out } function rotateZ$2(out, a, rad) { rad *= .5; var ax = a[0] , ay = a[1] , az = a[2] , aw = a[3]; var bz = Math.sin(rad) , bw = Math.cos(rad); out[0] = ax * bw + ay * bz; out[1] = ay * bw - ax * bz; out[2] = az * bw + aw * bz; out[3] = aw * bw - az * bz; return out } function calculateW(out, a) { var x = a[0] , y = a[1] , z = a[2]; out[0] = x; out[1] = y; out[2] = z; out[3] = Math.sqrt(Math.abs(1 - x * x - y * y - z * z)); return out } function exp(out, a) { var x = a[0] , y = a[1] , z = a[2] , w = a[3]; var r = Math.sqrt(x * x + y * y + z * z); var et = Math.exp(w); var s = r > 0 ? et * Math.sin(r) / r : 0; out[0] = x * s; out[1] = y * s; out[2] = z * s; out[3] = et * Math.cos(r); return out } function ln(out, a) { var x = a[0] , y = a[1] , z = a[2] , w = a[3]; var r = Math.sqrt(x * x + y * y + z * z); var t = r > 0 ? Math.atan2(r, w) / r : 0; out[0] = x * t; out[1] = y * t; out[2] = z * t; out[3] = .5 * Math.log(x * x + y * y + z * z + w * w); return out } function pow(out, a, b) { ln(out, a); scale$6(out, out, b); exp(out, out); return out } function slerp(out, a, b, t) { var ax = a[0] , ay = a[1] , az = a[2] , aw = a[3]; var bx = b[0] , by = b[1] , bz = b[2] , bw = b[3]; var omega, cosom, sinom, scale0, scale1; cosom = ax * bx + ay * by + az * bz + aw * bw; if (cosom < 0) { cosom = -cosom; bx = -bx; by = -by; bz = -bz; bw = -bw } if (1 - cosom > EPSILON) { omega = Math.acos(cosom); sinom = Math.sin(omega); scale0 = Math.sin((1 - t) * omega) / sinom; scale1 = Math.sin(t * omega) / sinom } else { scale0 = 1 - t; scale1 = t } out[0] = scale0 * ax + scale1 * bx; out[1] = scale0 * ay + scale1 * by; out[2] = scale0 * az + scale1 * bz; out[3] = scale0 * aw + scale1 * bw; return out } function random$2(out) { var u1 = RANDOM(); var u2 = RANDOM(); var u3 = RANDOM(); var sqrt1MinusU1 = Math.sqrt(1 - u1); var sqrtU1 = Math.sqrt(u1); out[0] = sqrt1MinusU1 * Math.sin(2 * Math.PI * u2); out[1] = sqrt1MinusU1 * Math.cos(2 * Math.PI * u2); out[2] = sqrtU1 * Math.sin(2 * Math.PI * u3); out[3] = sqrtU1 * Math.cos(2 * Math.PI * u3); return out } function invert$4(out, a) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3]; var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; var invDot = dot ? 1 / dot : 0; out[0] = -a0 * invDot; out[1] = -a1 * invDot; out[2] = -a2 * invDot; out[3] = a3 * invDot; return out } function conjugate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; return out } function fromMat3(out, m) { var fTrace = m[0] + m[4] + m[8]; var fRoot; if (fTrace > 0) { fRoot = Math.sqrt(fTrace + 1); out[3] = .5 * fRoot; fRoot = .5 / fRoot; out[0] = (m[5] - m[7]) * fRoot; out[1] = (m[6] - m[2]) * fRoot; out[2] = (m[1] - m[3]) * fRoot } else { var i = 0; if (m[4] > m[0]) i = 1; if (m[8] > m[i * 3 + i]) i = 2; var j = (i + 1) % 3; var k = (i + 2) % 3; fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1); out[i] = .5 * fRoot; fRoot = .5 / fRoot; out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot } return out } function fromEuler(out, x, y, z) { var halfToRad = .5 * Math.PI / 180; x *= halfToRad; y *= halfToRad; z *= halfToRad; var sx = Math.sin(x); var cx = Math.cos(x); var sy = Math.sin(y); var cy = Math.cos(y); var sz = Math.sin(z); var cz = Math.cos(z); out[0] = sx * cy * cz - cx * sy * sz; out[1] = cx * sy * cz + sx * cy * sz; out[2] = cx * cy * sz - sx * sy * cz; out[3] = cx * cy * cz + sx * sy * sz; return out } function str$6(a) { return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")" } var clone$6 = clone$5; var fromValues$6 = fromValues$5; var copy$6 = copy$5; var set$6 = set$5; var add$6 = add$5; var mul$6 = multiply$6; var scale$6 = scale$5; var dot$2 = dot$1; var lerp$2 = lerp$1; var length$2 = length$1; var len$2 = length$2; var squaredLength$2 = squaredLength$1; var sqrLen$2 = squaredLength$2; var normalize$2 = normalize$1; var exactEquals$6 = exactEquals$5; var equals$7 = equals$6; var rotationTo = function() { var tmpvec3 = create$4(); var xUnitVec3 = fromValues$4(1, 0, 0); var yUnitVec3 = fromValues$4(0, 1, 0); return function(out, a, b) { var dot$1 = dot(a, b); if (dot$1 < -.999999) { cross(tmpvec3, xUnitVec3, a); if (len(tmpvec3) < 1E-6) cross(tmpvec3, yUnitVec3, a); normalize(tmpvec3, tmpvec3); setAxisAngle(out, tmpvec3, Math.PI); return out } else if (dot$1 > .999999) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; return out } else { cross(tmpvec3, a, b); out[0] = tmpvec3[0]; out[1] = tmpvec3[1]; out[2] = tmpvec3[2]; out[3] = 1 + dot$1; return normalize$2(out, out) } } }(); var sqlerp = function() { var temp1 = create$6(); var temp2 = create$6(); return function(out, a, b, c, d, t) { slerp(temp1, a, d, t); slerp(temp2, b, c, t); slerp(out, temp1, temp2, 2 * t * (1 - t)); return out } }(); var setAxes = function() { var matr = create$2(); return function(out, view, right, up) { matr[0] = right[0]; matr[3] = right[1]; matr[6] = right[2]; matr[1] = up[0]; matr[4] = up[1]; matr[7] = up[2]; matr[2] = -view[0]; matr[5] = -view[1]; matr[8] = -view[2]; return normalize$2(out, fromMat3(out, matr)) } }(); var quat = Object.freeze({ __proto__: null, create: create$6, identity: identity$4, setAxisAngle: setAxisAngle, getAxisAngle: getAxisAngle, getAngle: getAngle, multiply: multiply$6, rotateX: rotateX$2, rotateY: rotateY$2, rotateZ: rotateZ$2, calculateW: calculateW, exp: exp, ln: ln, pow: pow, slerp: slerp, random: random$2, invert: invert$4, conjugate: conjugate, fromMat3: fromMat3, fromEuler: fromEuler, str: str$6, clone: clone$6, fromValues: fromValues$6, copy: copy$6, set: set$6, add: add$6, mul: mul$6, scale: scale$6, dot: dot$2, lerp: lerp$2, length: length$2, len: len$2, squaredLength: squaredLength$2, sqrLen: sqrLen$2, normalize: normalize$2, exactEquals: exactEquals$6, equals: equals$7, rotationTo: rotationTo, sqlerp: sqlerp, setAxes: setAxes }); function create$7() { var dq = new ARRAY_TYPE(8); if (ARRAY_TYPE != Float32Array) { dq[0] = 0; dq[1] = 0; dq[2] = 0; dq[4] = 0; dq[5] = 0; dq[6] = 0; dq[7] = 0 } dq[3] = 1; return dq } function clone$7(a) { var dq = new ARRAY_TYPE(8); dq[0] = a[0]; dq[1] = a[1]; dq[2] = a[2]; dq[3] = a[3]; dq[4] = a[4]; dq[5] = a[5]; dq[6] = a[6]; dq[7] = a[7]; return dq } function fromValues$7(x1, y1, z1, w1, x2, y2, z2, w2) { var dq = new ARRAY_TYPE(8); dq[0] = x1; dq[1] = y1; dq[2] = z1; dq[3] = w1; dq[4] = x2; dq[5] = y2; dq[6] = z2; dq[7] = w2; return dq } function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) { var dq = new ARRAY_TYPE(8); dq[0] = x1; dq[1] = y1; dq[2] = z1; dq[3] = w1; var ax = x2 * .5 , ay = y2 * .5 , az = z2 * .5; dq[4] = ax * w1 + ay * z1 - az * y1; dq[5] = ay * w1 + az * x1 - ax * z1; dq[6] = az * w1 + ax * y1 - ay * x1; dq[7] = -ax * x1 - ay * y1 - az * z1; return dq } function fromRotationTranslation$1(out, q, t) { var ax = t[0] * .5 , ay = t[1] * .5 , az = t[2] * .5 , bx = q[0] , by = q[1] , bz = q[2] , bw = q[3]; out[0] = bx; out[1] = by; out[2] = bz; out[3] = bw; out[4] = ax * bw + ay * bz - az * by; out[5] = ay * bw + az * bx - ax * bz; out[6] = az * bw + ax * by - ay * bx; out[7] = -ax * bx - ay * by - az * bz; return out } function fromTranslation$3(out, t) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = t[0] * .5; out[5] = t[1] * .5; out[6] = t[2] * .5; out[7] = 0; return out } function fromRotation$4(out, q) { out[0] = q[0]; out[1] = q[1]; out[2] = q[2]; out[3] = q[3]; out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; return out } function fromMat4$1(out, a) { var outer = create$6(); getRotation(outer, a); var t = new ARRAY_TYPE(3); getTranslation(t, a); fromRotationTranslation$1(out, outer, t); return out } function copy$7(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7]; return out } function identity$5(out) { out[0] = 0; out[1] = 0; out[2] = 0; out[3] = 1; out[4] = 0; out[5] = 0; out[6] = 0; out[7] = 0; return out } function set$7(out, x1, y1, z1, w1, x2, y2, z2, w2) { out[0] = x1; out[1] = y1; out[2] = z1; out[3] = w1; out[4] = x2; out[5] = y2; out[6] = z2; out[7] = w2; return out } var getReal = copy$6; function getDual(out, a) { out[0] = a[4]; out[1] = a[5]; out[2] = a[6]; out[3] = a[7]; return out } var setReal = copy$6; function setDual(out, q) { out[4] = q[0]; out[5] = q[1]; out[6] = q[2]; out[7] = q[3]; return out } function getTranslation$1(out, a) { var ax = a[4] , ay = a[5] , az = a[6] , aw = a[7] , bx = -a[0] , by = -a[1] , bz = -a[2] , bw = a[3]; out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; return out } function translate$3(out, a, v) { var ax1 = a[0] , ay1 = a[1] , az1 = a[2] , aw1 = a[3] , bx1 = v[0] * .5 , by1 = v[1] * .5 , bz1 = v[2] * .5 , ax2 = a[4] , ay2 = a[5] , az2 = a[6] , aw2 = a[7]; out[0] = ax1; out[1] = ay1; out[2] = az1; out[3] = aw1; out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2; out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2; out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2; out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2; return out } function rotateX$3(out, a, rad) { var bx = -a[0] , by = -a[1] , bz = -a[2] , bw = a[3] , ax = a[4] , ay = a[5] , az = a[6] , aw = a[7] , ax1 = ax * bw + aw * bx + ay * bz - az * by , ay1 = ay * bw + aw * by + az * bx - ax * bz , az1 = az * bw + aw * bz + ax * by - ay * bx , aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateX$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out } function rotateY$3(out, a, rad) { var bx = -a[0] , by = -a[1] , bz = -a[2] , bw = a[3] , ax = a[4] , ay = a[5] , az = a[6] , aw = a[7] , ax1 = ax * bw + aw * bx + ay * bz - az * by , ay1 = ay * bw + aw * by + az * bx - ax * bz , az1 = az * bw + aw * bz + ax * by - ay * bx , aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateY$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out } function rotateZ$3(out, a, rad) { var bx = -a[0] , by = -a[1] , bz = -a[2] , bw = a[3] , ax = a[4] , ay = a[5] , az = a[6] , aw = a[7] , ax1 = ax * bw + aw * bx + ay * bz - az * by , ay1 = ay * bw + aw * by + az * bx - ax * bz , az1 = az * bw + aw * bz + ax * by - ay * bx , aw1 = aw * bw - ax * bx - ay * by - az * bz; rotateZ$2(out, a, rad); bx = out[0]; by = out[1]; bz = out[2]; bw = out[3]; out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; return out } function rotateByQuatAppend(out, a, q) { var qx = q[0] , qy = q[1] , qz = q[2] , qw = q[3] , ax = a[0] , ay = a[1] , az = a[2] , aw = a[3]; out[0] = ax * qw + aw * qx + ay * qz - az * qy; out[1] = ay * qw + aw * qy + az * qx - ax * qz; out[2] = az * qw + aw * qz + ax * qy - ay * qx; out[3] = aw * qw - ax * qx - ay * qy - az * qz; ax = a[4]; ay = a[5]; az = a[6]; aw = a[7]; out[4] = ax * qw + aw * qx + ay * qz - az * qy; out[5] = ay * qw + aw * qy + az * qx - ax * qz; out[6] = az * qw + aw * qz + ax * qy - ay * qx; out[7] = aw * qw - ax * qx - ay * qy - az * qz; return out } function rotateByQuatPrepend(out, q, a) { var qx = q[0] , qy = q[1] , qz = q[2] , qw = q[3] , bx = a[0] , by = a[1] , bz = a[2] , bw = a[3]; out[0] = qx * bw + qw * bx + qy * bz - qz * by; out[1] = qy * bw + qw * by + qz * bx - qx * bz; out[2] = qz * bw + qw * bz + qx * by - qy * bx; out[3] = qw * bw - qx * bx - qy * by - qz * bz; bx = a[4]; by = a[5]; bz = a[6]; bw = a[7]; out[4] = qx * bw + qw * bx + qy * bz - qz * by; out[5] = qy * bw + qw * by + qz * bx - qx * bz; out[6] = qz * bw + qw * bz + qx * by - qy * bx; out[7] = qw * bw - qx * bx - qy * by - qz * bz; return out } function rotateAroundAxis(out, a, axis, rad) { if (Math.abs(rad) < EPSILON) return copy$7(out, a); var axisLength = Math.hypot(axis[0], axis[1], axis[2]); rad = rad * .5; var s = Math.sin(rad); var bx = s * axis[0] / axisLength; var by = s * axis[1] / axisLength; var bz = s * axis[2] / axisLength; var bw = Math.cos(rad); var ax1 = a[0] , ay1 = a[1] , az1 = a[2] , aw1 = a[3]; out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; var ax = a[4] , ay = a[5] , az = a[6] , aw = a[7]; out[4] = ax * bw + aw * bx + ay * bz - az * by; out[5] = ay * bw + aw * by + az * bx - ax * bz; out[6] = az * bw + aw * bz + ax * by - ay * bx; out[7] = aw * bw - ax * bx - ay * by - az * bz; return out } function add$7(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; out[4] = a[4] + b[4]; out[5] = a[5] + b[5]; out[6] = a[6] + b[6]; out[7] = a[7] + b[7]; return out } function multiply$7(out, a, b) { var ax0 = a[0] , ay0 = a[1] , az0 = a[2] , aw0 = a[3] , bx1 = b[4] , by1 = b[5] , bz1 = b[6] , bw1 = b[7] , ax1 = a[4] , ay1 = a[5] , az1 = a[6] , aw1 = a[7] , bx0 = b[0] , by0 = b[1] , bz0 = b[2] , bw0 = b[3]; out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0; out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0; out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0; out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0; out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0; out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0; out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0; out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0; return out } var mul$7 = multiply$7; function scale$7(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; out[4] = a[4] * b; out[5] = a[5] * b; out[6] = a[6] * b; out[7] = a[7] * b; return out } var dot$3 = dot$2; function lerp$3(out, a, b, t) { var mt = 1 - t; if (dot$3(a, b) < 0) t = -t; out[0] = a[0] * mt + b[0] * t; out[1] = a[1] * mt + b[1] * t; out[2] = a[2] * mt + b[2] * t; out[3] = a[3] * mt + b[3] * t; out[4] = a[4] * mt + b[4] * t; out[5] = a[5] * mt + b[5] * t; out[6] = a[6] * mt + b[6] * t; out[7] = a[7] * mt + b[7] * t; return out } function invert$5(out, a) { var sqlen = squaredLength$3(a); out[0] = -a[0] / sqlen; out[1] = -a[1] / sqlen; out[2] = -a[2] / sqlen; out[3] = a[3] / sqlen; out[4] = -a[4] / sqlen; out[5] = -a[5] / sqlen; out[6] = -a[6] / sqlen; out[7] = a[7] / sqlen; return out } function conjugate$1(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a[3]; out[4] = -a[4]; out[5] = -a[5]; out[6] = -a[6]; out[7] = a[7]; return out } var length$3 = length$2; var len$3 = length$3; var squaredLength$3 = squaredLength$2; var sqrLen$3 = squaredLength$3; function normalize$3(out, a) { var magnitude = squaredLength$3(a); if (magnitude > 0) { magnitude = Math.sqrt(magnitude); var a0 = a[0] / magnitude; var a1 = a[1] / magnitude; var a2 = a[2] / magnitude; var a3 = a[3] / magnitude; var b0 = a[4]; var b1 = a[5]; var b2 = a[6]; var b3 = a[7]; var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3; out[0] = a0; out[1] = a1; out[2] = a2; out[3] = a3; out[4] = (b0 - a0 * a_dot_b) / magnitude; out[5] = (b1 - a1 * a_dot_b) / magnitude; out[6] = (b2 - a2 * a_dot_b) / magnitude; out[7] = (b3 - a3 * a_dot_b) / magnitude } return out } function str$7(a) { return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")" } function exactEquals$7(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] } function equals$8(a, b) { var a0 = a[0] , a1 = a[1] , a2 = a[2] , a3 = a[3] , a4 = a[4] , a5 = a[5] , a6 = a[6] , a7 = a[7]; var b0 = b[0] , b1 = b[1] , b2 = b[2] , b3 = b[3] , b4 = b[4] , b5 = b[5] , b6 = b[6] , b7 = b[7]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) } var quat2 = Object.freeze({ __proto__: null, create: create$7, clone: clone$7, fromValues: fromValues$7, fromRotationTranslationValues: fromRotationTranslationValues, fromRotationTranslation: fromRotationTranslation$1, fromTranslation: fromTranslation$3, fromRotation: fromRotation$4, fromMat4: fromMat4$1, copy: copy$7, identity: identity$5, set: set$7, getReal: getReal, getDual: getDual, setReal: setReal, setDual: setDual, getTranslation: getTranslation$1, translate: translate$3, rotateX: rotateX$3, rotateY: rotateY$3, rotateZ: rotateZ$3, rotateByQuatAppend: rotateByQuatAppend, rotateByQuatPrepend: rotateByQuatPrepend, rotateAroundAxis: rotateAroundAxis, add: add$7, multiply: multiply$7, mul: mul$7, scale: scale$7, dot: dot$3, lerp: lerp$3, invert: invert$5, conjugate: conjugate$1, length: length$3, len: len$3, squaredLength: squaredLength$3, sqrLen: sqrLen$3, normalize: normalize$3, str: str$7, exactEquals: exactEquals$7, equals: equals$8 }); function create$8() { var out = new ARRAY_TYPE(2); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0 } return out } function clone$8(a) { var out = new ARRAY_TYPE(2); out[0] = a[0]; out[1] = a[1]; return out } function fromValues$8(x, y) { var out = new ARRAY_TYPE(2); out[0] = x; out[1] = y; return out } function copy$8(out, a) { out[0] = a[0]; out[1] = a[1]; return out } function set$8(out, x, y) { out[0] = x; out[1] = y; return out } function add$8(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; return out } function subtract$6(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; return out } function multiply$8(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; return out } function divide$2(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; return out } function ceil$2(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); return out } function floor$2(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); return out } function min$2(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); return out } function max$2(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); return out } function round$2(out, a) { out[0] = Math.round(a[0]); out[1] = Math.round(a[1]); return out } function scale$8(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; return out } function scaleAndAdd$2(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; return out } function distance$2(a, b) { var x = b[0] - a[0] , y = b[1] - a[1]; return Math.hypot(x, y) } function squaredDistance$2(a, b) { var x = b[0] - a[0] , y = b[1] - a[1]; return x * x + y * y } function length$4(a) { var x = a[0] , y = a[1]; return Math.hypot(x, y) } function squaredLength$4(a) { var x = a[0] , y = a[1]; return x * x + y * y } function negate$2(out, a) { out[0] = -a[0]; out[1] = -a[1]; return out } function inverse$2(out, a) { out[0] = 1 / a[0]; out[1] = 1 / a[1]; return out } function normalize$4(out, a) { var x = a[0] , y = a[1]; var len = x * x + y * y; if (len > 0) len = 1 / Math.sqrt(len); out[0] = a[0] * len; out[1] = a[1] * len; return out } function dot$4(a, b) { return a[0] * b[0] + a[1] * b[1] } function cross$2(out, a, b) { var z = a[0] * b[1] - a[1] * b[0]; out[0] = out[1] = 0; out[2] = z; return out } function lerp$4(out, a, b, t) { var ax = a[0] , ay = a[1]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); return out } function random$3(out, scale) { scale = scale || 1; var r = RANDOM() * 2 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; return out } function transformMat2(out, a, m) { var x = a[0] , y = a[1]; out[0] = m[0] * x + m[2] * y; out[1] = m[1] * x + m[3] * y; return out } function transformMat2d(out, a, m) { var x = a[0] , y = a[1]; out[0] = m[0] * x + m[2] * y + m[4]; out[1] = m[1] * x + m[3] * y + m[5]; return out } function transformMat3$1(out, a, m) { var x = a[0] , y = a[1]; out[0] = m[0] * x + m[3] * y + m[6]; out[1] = m[1] * x + m[4] * y + m[7]; return out } function transformMat4$2(out, a, m) { var x = a[0]; var y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; return out } function rotate$4(out, a, b, rad) { var p0 = a[0] - b[0] , p1 = a[1] - b[1] , sinC = Math.sin(rad) , cosC = Math.cos(rad); out[0] = p0 * cosC - p1 * sinC + b[0]; out[1] = p0 * sinC + p1 * cosC + b[1]; return out } function angle$1(a, b) { var x1 = a[0] , y1 = a[1] , x2 = b[0] , y2 = b[1] , mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2) , cosine = mag && (x1 * x2 + y1 * y2) / mag; return Math.acos(Math.min(Math.max(cosine, -1), 1)) } function zero$2(out) { out[0] = 0; out[1] = 0; return out } function str$8(a) { return "vec2(" + a[0] + ", " + a[1] + ")" } function exactEquals$8(a, b) { return a[0] === b[0] && a[1] === b[1] } function equals$9(a, b) { var a0 = a[0] , a1 = a[1]; var b0 = b[0] , b1 = b[1]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) } var len$4 = length$4; var sub$6 = subtract$6; var mul$8 = multiply$8; var div$2 = divide$2; var dist$2 = distance$2; var sqrDist$2 = squaredDistance$2; var sqrLen$4 = squaredLength$4; var forEach$2 = function() { var vec = create$8(); return function(a, stride, offset, count, fn, arg) { var i, l; if (!stride) stride = 2; if (!offset) offset = 0; if (count) l = Math.min(count * stride + offset, a.length); else l = a.length; for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1] } return a } }(); var vec2 = Object.freeze({ __proto__: null, create: create$8, clone: clone$8, fromValues: fromValues$8, copy: copy$8, set: set$8, add: add$8, subtract: subtract$6, multiply: multiply$8, divide: divide$2, ceil: ceil$2, floor: floor$2, min: min$2, max: max$2, round: round$2, scale: scale$8, scaleAndAdd: scaleAndAdd$2, distance: distance$2, squaredDistance: squaredDistance$2, length: length$4, squaredLength: squaredLength$4, negate: negate$2, inverse: inverse$2, normalize: normalize$4, dot: dot$4, cross: cross$2, lerp: lerp$4, random: random$3, transformMat2: transformMat2, transformMat2d: transformMat2d, transformMat3: transformMat3$1, transformMat4: transformMat4$2, rotate: rotate$4, angle: angle$1, zero: zero$2, str: str$8, exactEquals: exactEquals$8, equals: equals$9, len: len$4, sub: sub$6, mul: mul$8, div: div$2, dist: dist$2, sqrDist: sqrDist$2, sqrLen: sqrLen$4, forEach: forEach$2 }); exports.glMatrix = common; exports.mat2 = mat2; exports.mat2d = mat2d; exports.mat3 = mat3; exports.mat4 = mat4; exports.quat = quat; exports.quat2 = quat2; exports.vec2 = vec2; exports.vec3 = vec3; exports.vec4 = vec4; Object.defineProperty(exports, "__esModule", { value: true }) }); 'use strict'; { function lineInt(l1, l2, precision) { precision = precision || 0; var i = [0, 0]; var a1, b1, c1, a2, b2, c2, det; a1 = l1[1][1] - l1[0][1]; b1 = l1[0][0] - l1[1][0]; c1 = a1 * l1[0][0] + b1 * l1[0][1]; a2 = l2[1][1] - l2[0][1]; b2 = l2[0][0] - l2[1][0]; c2 = a2 * l2[0][0] + b2 * l2[0][1]; det = a1 * b2 - a2 * b1; if (!scalar_eq(det, 0, precision)) { i[0] = (b2 * c1 - b1 * c2) / det; i[1] = (a1 * c2 - a2 * c1) / det } return i } function lineSegmentsIntersect(p1, p2, q1, q2) { var dx = p2[0] - p1[0]; var dy = p2[1] - p1[1]; var da = q2[0] - q1[0]; var db = q2[1] - q1[1]; if (da * dy - db * dx === 0) return false; var s = (dx * (q1[1] - p1[1]) + dy * (p1[0] - q1[0])) / (da * dy - db * dx); var t = (da * (p1[1] - q1[1]) + db * (q1[0] - p1[0])) / (db * dx - da * dy); return s >= 0 && s <= 1 && t >= 0 && t <= 1 } function triangleArea(a, b, c) { return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]) } function isLeft(a, b, c) { return triangleArea(a, b, c) > 0 } function isLeftOn(a, b, c) { return triangleArea(a, b, c) >= 0 } function isRight(a, b, c) { return triangleArea(a, b, c) < 0 } function isRightOn(a, b, c) { return triangleArea(a, b, c) <= 0 } var tmpPoint1 = [] , tmpPoint2 = []; function collinear(a, b, c, thresholdAngle) { if (!thresholdAngle) return triangleArea(a, b, c) === 0; else { var ab = tmpPoint1 , bc = tmpPoint2; ab[0] = b[0] - a[0]; ab[1] = b[1] - a[1]; bc[0] = c[0] - b[0]; bc[1] = c[1] - b[1]; var dot = ab[0] * bc[0] + ab[1] * bc[1] , magA = Math.sqrt(ab[0] * ab[0] + ab[1] * ab[1]) , magB = Math.sqrt(bc[0] * bc[0] + bc[1] * bc[1]) , angle = Math.acos(dot / (magA * magB)); return angle < thresholdAngle } } function sqdist(a, b) { var dx = b[0] - a[0]; var dy = b[1] - a[1]; return dx * dx + dy * dy } function polygonAt(polygon, i) { var s = polygon.length; return polygon[i < 0 ? i % s + s : i % s] } function polygonClear(polygon) { polygon.length = 0 } function polygonAppend(polygon, poly, from, to) { for (var i = from; i < to; i++) polygon.push(poly[i]) } function polygonMakeCCW(polygon) { var br = 0 , v = polygon; for (var i = 1; i < polygon.length; ++i) if (v[i][1] < v[br][1] || v[i][1] === v[br][1] && v[i][0] > v[br][0]) br = i; if (!isLeft(polygonAt(polygon, br - 1), polygonAt(polygon, br), polygonAt(polygon, br + 1))) { polygonReverse(polygon); return true } else return false } function polygonReverse(polygon) { var tmp = []; var N = polygon.length; for (var i = 0; i !== N; i++) tmp.push(polygon.pop()); for (var i = 0; i !== N; i++) polygon[i] = tmp[i] } function polygonIsReflex(polygon, i) { return isRight(polygonAt(polygon, i - 1), polygonAt(polygon, i), polygonAt(polygon, i + 1)) } var tmpLine1 = [] , tmpLine2 = []; function polygonCanSee(polygon, a, b) { var p, dist, l1 = tmpLine1, l2 = tmpLine2; if (isLeftOn(polygonAt(polygon, a + 1), polygonAt(polygon, a), polygonAt(polygon, b)) && isRightOn(polygonAt(polygon, a - 1), polygonAt(polygon, a), polygonAt(polygon, b))) return false; dist = sqdist(polygonAt(polygon, a), polygonAt(polygon, b)); for (var i = 0; i !== polygon.length; ++i) { if ((i + 1) % polygon.length === a || i === a) continue; if (isLeftOn(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i + 1)) && isRightOn(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i))) { l1[0] = polygonAt(polygon, a); l1[1] = polygonAt(polygon, b); l2[0] = polygonAt(polygon, i); l2[1] = polygonAt(polygon, i + 1); p = lineInt(l1, l2); if (sqdist(polygonAt(polygon, a), p) < dist) return false } } return true } function polygonCanSee2(polygon, a, b) { for (var i = 0; i !== polygon.length; ++i) { if (i === a || i === b || (i + 1) % polygon.length === a || (i + 1) % polygon.length === b) continue; if (lineSegmentsIntersect(polygonAt(polygon, a), polygonAt(polygon, b), polygonAt(polygon, i), polygonAt(polygon, i + 1))) return false } return true } function polygonCopy(polygon, i, j, targetPoly) { var p = targetPoly || []; polygonClear(p); if (i < j) for (var k = i; k <= j; k++) p.push(polygon[k]); else { for (var k = 0; k <= j; k++) p.push(polygon[k]); for (var k = i; k < polygon.length; k++) p.push(polygon[k]) } return p } function polygonGetCutEdges(polygon) { var min = [] , tmp1 = [] , tmp2 = [] , tmpPoly = []; var nDiags = Number.MAX_VALUE; for (var i = 0; i < polygon.length; ++i) if (polygonIsReflex(polygon, i)) for (var j = 0; j < polygon.length; ++j) if (polygonCanSee(polygon, i, j)) { tmp1 = polygonGetCutEdges(polygonCopy(polygon, i, j, tmpPoly)); tmp2 = polygonGetCutEdges(polygonCopy(polygon, j, i, tmpPoly)); for (var k = 0; k < tmp2.length; k++) tmp1.push(tmp2[k]); if (tmp1.length < nDiags) { min = tmp1; nDiags = tmp1.length; min.push([polygonAt(polygon, i), polygonAt(polygon, j)]) } } return min } function polygonDecomp(polygon) { var edges = polygonGetCutEdges(polygon); if (edges.length > 0) return polygonSlice(polygon, edges); else return [polygon] } function polygonSlice(polygon, cutEdges) { if (cutEdges.length === 0) return [polygon]; if (cutEdges instanceof Array && cutEdges.length && cutEdges[0]instanceof Array && cutEdges[0].length === 2 && cutEdges[0][0]instanceof Array) { var polys = [polygon]; for (var i = 0; i < cutEdges.length; i++) { var cutEdge = cutEdges[i]; for (var j = 0; j < polys.length; j++) { var poly = polys[j]; var result = polygonSlice(poly, cutEdge); if (result) { polys.splice(j, 1); polys.push(result[0], result[1]); break } } } return polys } else { var cutEdge = cutEdges; var i = polygon.indexOf(cutEdge[0]); var j = polygon.indexOf(cutEdge[1]); if (i !== -1 && j !== -1) return [polygonCopy(polygon, i, j), polygonCopy(polygon, j, i)]; else return false } } function polygonIsSimple(polygon) { var path = polygon, i; for (i = 0; i < path.length - 1; i++) for (var j = 0; j < i - 1; j++) if (lineSegmentsIntersect(path[i], path[i + 1], path[j], path[j + 1])) return false; for (i = 1; i < path.length - 2; i++) if (lineSegmentsIntersect(path[0], path[path.length - 1], path[i], path[i + 1])) return false; return true } function getIntersectionPoint(p1, p2, q1, q2, delta) { delta = delta || 0; var a1 = p2[1] - p1[1]; var b1 = p1[0] - p2[0]; var c1 = a1 * p1[0] + b1 * p1[1]; var a2 = q2[1] - q1[1]; var b2 = q1[0] - q2[0]; var c2 = a2 * q1[0] + b2 * q1[1]; var det = a1 * b2 - a2 * b1; if (!scalar_eq(det, 0, delta)) return [(b2 * c1 - b1 * c2) / det, (a1 * c2 - a2 * c1) / det]; else return [0, 0] } function polygonQuickDecomp(polygon, result, reflexVertices, steinerPoints, delta, maxlevel, level) { maxlevel = maxlevel || 100; level = level || 0; delta = delta || 25; result = typeof result !== "undefined" ? result : []; reflexVertices = reflexVertices || []; steinerPoints = steinerPoints || []; var upperInt = [0, 0] , lowerInt = [0, 0] , p = [0, 0]; var upperDist = 0 , lowerDist = 0 , d = 0 , closestDist = 0; var upperIndex = 0 , lowerIndex = 0 , closestIndex = 0; var lowerPoly = [] , upperPoly = []; var poly = polygon , v = polygon; if (v.length < 3) return result; level++; if (level > maxlevel) { console.warn("quickDecomp: max level (" + maxlevel + ") reached."); return result } for (var i = 0; i < polygon.length; ++i) if (polygonIsReflex(poly, i)) { reflexVertices.push(poly[i]); upperDist = lowerDist = Number.MAX_VALUE; for (var j = 0; j < polygon.length; ++j) { if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) && isRightOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j - 1))) { p = getIntersectionPoint(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j - 1)); if (isRight(polygonAt(poly, i + 1), polygonAt(poly, i), p)) { d = sqdist(poly[i], p); if (d < lowerDist) { lowerDist = d; lowerInt = p; lowerIndex = j } } } if (isLeft(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j + 1)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) { p = getIntersectionPoint(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j + 1)); if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), p)) { d = sqdist(poly[i], p); if (d < upperDist) { upperDist = d; upperInt = p; upperIndex = j } } } } if (lowerIndex === (upperIndex + 1) % polygon.length) { p[0] = (lowerInt[0] + upperInt[0]) / 2; p[1] = (lowerInt[1] + upperInt[1]) / 2; steinerPoints.push(p); if (i < upperIndex) { polygonAppend(lowerPoly, poly, i, upperIndex + 1); lowerPoly.push(p); upperPoly.push(p); if (lowerIndex !== 0) polygonAppend(upperPoly, poly, lowerIndex, poly.length); polygonAppend(upperPoly, poly, 0, i + 1) } else { if (i !== 0) polygonAppend(lowerPoly, poly, i, poly.length); polygonAppend(lowerPoly, poly, 0, upperIndex + 1); lowerPoly.push(p); upperPoly.push(p); polygonAppend(upperPoly, poly, lowerIndex, i + 1) } } else { if (lowerIndex > upperIndex) upperIndex += polygon.length; closestDist = Number.MAX_VALUE; if (upperIndex < lowerIndex) return result; for (var j = lowerIndex; j <= upperIndex; ++j) if (isLeftOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) { d = sqdist(polygonAt(poly, i), polygonAt(poly, j)); if (d < closestDist && polygonCanSee2(poly, i, j)) { closestDist = d; closestIndex = j % polygon.length } } if (i < closestIndex) { polygonAppend(lowerPoly, poly, i, closestIndex + 1); if (closestIndex !== 0) polygonAppend(upperPoly, poly, closestIndex, v.length); polygonAppend(upperPoly, poly, 0, i + 1) } else { if (i !== 0) polygonAppend(lowerPoly, poly, i, v.length); polygonAppend(lowerPoly, poly, 0, closestIndex + 1); polygonAppend(upperPoly, poly, closestIndex, i + 1) } } if (lowerPoly.length < upperPoly.length) { polygonQuickDecomp(lowerPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level); polygonQuickDecomp(upperPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level) } else { polygonQuickDecomp(upperPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level); polygonQuickDecomp(lowerPoly, result, reflexVertices, steinerPoints, delta, maxlevel, level) } return result } result.push(polygon); return result } function polygonRemoveCollinearPoints(polygon, precision) { var num = 0; for (var i = polygon.length - 1; polygon.length > 3 && i >= 0; --i) if (collinear(polygonAt(polygon, i - 1), polygonAt(polygon, i), polygonAt(polygon, i + 1), precision)) { polygon.splice(i % polygon.length, 1); num++ } return num } function polygonRemoveDuplicatePoints(polygon, precision) { for (var i = polygon.length - 1; i >= 1; --i) { var pi = polygon[i]; for (var j = i - 1; j >= 0; --j) if (points_eq(pi, polygon[j], precision)) { polygon.splice(i, 1); continue } } } function scalar_eq(a, b, precision) { precision = precision || 0; return Math.abs(a - b) <= precision } function points_eq(a, b, precision) { return scalar_eq(a[0], b[0], precision) && scalar_eq(a[1], b[1], precision) } self.polyDecomp = { decomp: polygonDecomp, quickDecomp: polygonQuickDecomp, isSimple: polygonIsSimple, removeCollinearPoints: polygonRemoveCollinearPoints, removeDuplicatePoints: polygonRemoveDuplicatePoints, makeCCW: polygonMakeCCW } } ;'use strict'; { let isReady = false; let hasAppStarted = false; let buildMode = "dev"; const C3 = self.C3 = class C3 { constructor() { throw TypeError("static class can't be instantiated"); } static SetReady() { isReady = true } static IsReady() { return isReady } static SetAppStarted() { hasAppStarted = true } static HasAppStarted() { return hasAppStarted } static SetBuildMode(m) { buildMode = m } static GetBuildMode() { return buildMode } static IsReleaseBuild() { return buildMode === "final" } } ; C3.isDebug = false; C3.isDebugDefend = false; C3.hardwareConcurrency = navigator.hardwareConcurrency || 2 } ;'use strict'; { const C3 = self.C3; C3.QueryParser = class QueryParser { constructor(queryString) { this._queryString = queryString; this._parameters = new Map; this._Parse() } _Parse() { let str = this._queryString; if (str.startsWith("?") || str.startsWith("#")) str = str.substr(1); const arr = str.split("&"); for (const p of arr) this._ParseParameter(p) } _ParseParameter(p) { if (!p) return; if (!p.includes("=")) { this._parameters.set(p, null); return } const i = p.indexOf("="); const parameterName = decodeURIComponent(p.substring(0, i)); const parameterValue = decodeURIComponent(p.substring(i + 1)); this._parameters.set(parameterName, parameterValue) } LogAll() { for (const e of this._parameters) console.log("[QueryParser] Parameter '" + e[0] + "' = " + (e[1] === null ? "null" : "'" + e[1] + "'")) } Has(name) { return this._parameters.has(name) } Get(name) { const ret = this._parameters.get(name); if (typeof ret === "undefined") return null; else return ret } ClearHash() { history.replaceState("", document.title, location.pathname + location.search) } Reparse(str) { this._queryString = str; this._parameters.clear(); this._Parse() } } ; C3.QueryString = new C3.QueryParser(location.search); C3.LocationHashString = new C3.QueryParser(location.hash); if (C3.QueryString.Get("mode") !== "dev") C3.SetBuildMode("final") } ;'use strict'; { const C3 = self.C3; const UNKNOWN = "(unknown)"; const UA = navigator.userAgent; let Flags = { linux: /linux|openbsd|freebsd|netbsd/i.test(UA), chromeOS: /CrOS/.test(UA), windowsTizen: /trident|iemobile|msie|tizen/i.test(UA), genericMS: /trident|iemobile|msie|edge\//i.test(UA), opera: /OPR\//.test(UA), blackberry: /bb10/i.test(UA), edge: /edge\//i.test(UA), trident: /trident/i.test(UA), webkit: /webkit/i.test(UA), safari: /safari\//i.test(UA), chrome: /chrome\//i.test(UA), chromium: /chromium\//i.test(UA), crosswalk: /crosswalk|xwalk/i.test(UA), nwjs: /nwjs/i.test(UA), amazonwebapp: /amazonwebappplatform/i.test(UA), webview: /wv\)/.test(UA), android: /android/i.test(UA), nokia: /nokiabrowser\/[0-9.]+/i.test(UA) }; let Versions = { windows: /windows\s+nt\s+\d+\.\d+/i.exec(UA), OSX: /mac\s+os\s+x\s+[0-9_]+/i.exec(UA), android: /android\s+[0-9.]+/i.exec(UA), opera: /OPR\/[0-9.]+/.exec(UA), tizen: /tizen\s+[0-9.]+/i.exec(UA), iphone: /iphone\s+os\s+[0-9_]+/i.exec(UA), ipad: /ipad[^)]*os\s+[0-9_]+/i.exec(UA), winPhone: /windows\s+phone\s+[0-9.]+/i.exec(UA), winPhoneOS: /windows\s+phone\s+os\s+[0-9.]+/i.exec(UA), chrome: /chrome\/[0-9.]+/i.exec(UA), chromium: /chromium\/[0-9.]+/i.exec(UA), nwjs: /nwjs\/[0-9.]+/i.exec(UA), firefox: /firefox\/[0-9.]+/i.exec(UA), ie: /msie\s+[0-9.]+/i.exec(UA), edge: /edge\/[0-9.]+/i.exec(UA), edgeChromium: /edg\/[0-9.]+/i.exec(UA), silk: /silk\/[0-9.]+/i.exec(UA) }; let os = UNKNOWN; let os_version = UNKNOWN; let os_arch = UNKNOWN; let browser = UNKNOWN; let browser_version = UNKNOWN; let browser_arch = UNKNOWN; let engine = UNKNOWN; let context = "browser"; let is_desktop = false; let is_desktop_app = false; let testResults = new Map; function runTest(name, value, fn) { if (value === true) { const result = fn(); testResults.set(name, true) } else if (value && value.length) { const result = fn(value[0]); testResults.set(name, true) } else ; } runTest("isWindows", Versions.windows, WIN=>{ os = "Windows"; const nt_ver = WIN.split(" ")[2]; if (nt_ver) switch (nt_ver) { case "5.0": os_version = "2000"; break; case "5.1": os_version = "XP"; break; case "5.2": os_version = "XP"; break; case "6.0": os_version = "Vista"; break; case "6.1": os_version = "7"; break; case "6.2": os_version = "8"; break; case "6.3": os_version = "8.1"; break; case "10.0": os_version = "10"; break } } ); runTest("isOSX", Versions.OSX, OSX=>{ os = "Mac OS X"; const osx_ver = OSX.split(" ")[3]; if (osx_ver) os_version = osx_ver.replace("_", ".") } ); runTest("isLinux", Flags.linux, ()=>{ os = "Linux" } ); runTest("isChromeOS", Flags.chromeOS, ()=>{ os = "Chrome OS" } ); runTest("isAndroid", !Flags.windowsTizen && Versions.android, AND=>{ os = "Android"; const android_ver = AND.split(" ")[1]; if (android_ver) os_version = android_ver } ); runTest("isTizen", Versions.tizen, TIZ=>{ os = "Tizen"; const tizen_ver = TIZ.split(" ")[1]; if (tizen_ver) os_version = tizen_ver } ); runTest("isIPhone", !Flags.windowsTizen && Versions.iphone, IOS=>{ os = "iOS"; const ios_ver = IOS.split(" ")[2]; if (ios_ver) os_version = ios_ver.replace("_", ".") } ); runTest("isIPad", !Flags.windowsTizen && Versions.ipad, IOS=>{ os = "iOS"; const ios_ver = IOS.split(" ")[3]; if (ios_ver) os_version = ios_ver.replace("_", ".") } ); runTest("isWindowsPhone", Versions.winPhone, WIN=>{ os = "Windows Phone"; const ver_str = WIN.split(" ")[2]; if (ver_str) os_version = ver_str } ); runTest("isWindowsPhoneOS", Versions.winPhoneOS, WIN=>{ os = "Windows Phone"; const ver_str = WIN.split(" ")[3]; if (ver_str) os_version = ver_str } ); runTest("isBlackberry", Flags.blackberry, ()=>{ os = "Blackberry"; os_version = "10"; browser = "stock"; engine = "webkit" } ); runTest("isChrome", !Flags.edge && !Flags.opera && Versions.chrome, CHR=>{ browser = "Chrome"; engine = "Chromium"; const ver_str = CHR.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isOpera", Versions.opera, OPR=>{ browser = "Opera"; engine = "Chromium"; const ver_str = OPR.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isChromium", Versions.chromium, CHR=>{ browser = "Chromium"; engine = "Chromium"; const ver_str = CHR.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isFirefox", Versions.firefox, FIR=>{ browser = "Firefox"; engine = "Gecko"; const ver_str = FIR.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isInternetExplorer", Versions.ie, IE=>{ browser = "Internet Explorer"; engine = "Trident"; const ver_str = IE.split(" ")[1]; if (ver_str) browser_version = ver_str } ); runTest("isTrident", browser !== "Internet Explorer" && Flags.trident, ()=>{ engine = "Trident"; const rRv = /rv:[0-9.]+/i.exec(UA); if (rRv && rRv.length) { browser = "Internet Explorer"; const ver_str = rRv[0].split(":")[1]; if (ver_str) browser_version = ver_str } } ); runTest("isEdge", Versions.edge, EDGE=>{ browser = "Edge"; engine = "Edge"; const ver_str = EDGE.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isEdgeChromium", Versions.edgeChromium, EDGECHR=>{ browser = "Edge"; engine = "Chromium"; const ver_str = EDGECHR.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isSafari", Flags.safari && !Flags.nokia && !Flags.chrome && !Flags.chromium && !Flags.genericIE && !Flags.blackberry, ()=>{ browser = "Safari"; engine = "WebKit"; const rVersion = /version\/[0-9.]+/i.exec(UA); const rChromeiOS = /crios\/[0-9.]+/i.exec(UA); const rFirefoxiOS = /fxios\/[0-9.]+/i.exec(UA); if (rVersion && rVersion.length) { const ver_str = rVersion[0].split("/")[1]; if (ver_str) browser_version = ver_str } if (rChromeiOS && rChromeiOS.length) { browser = "Chrome for iOS"; const ver_str = rChromeiOS[0].split("/")[1]; if (ver_str) browser_version = ver_str } if (rFirefoxiOS && rFirefoxiOS.length) { browser = "Firefox for iOS"; const ver_str = rFirefoxiOS[0].split("/")[1]; if (ver_str) browser_version = ver_str } } ); runTest("isSilk", Versions.silk, SILK=>{ browser = "Silk"; const ver_str = SILK.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isCrosswalk", Flags.crosswalk, ()=>context = "crosswalk"); runTest("isCordova", self["device"] && (self["device"]["cordova"] || self["device"]["phonegap"]), ()=>context = "cordova"); runTest("isNWJS", Versions.nwjs, NWJS=>{ context = "nwjs"; browser = "NW.js"; engine = "Chromium"; const ver_str = NWJS.split("/")[1]; if (ver_str) browser_version = ver_str } ); runTest("isAmazonWebApp", Flags.amazonwebapp, ()=>context = "webapp"); runTest("isHomeScreenWebApp", context !== "nwjs" && typeof window !== "undefined" && (window.matchMedia && window.matchMedia("(display-mode: standalone)").matches || navigator["standalone"]), ()=>context = "webapp"); runTest("isFalseSafari", browser === "Safari" && (os === "Android" || os === "Tizen" || os === "Blackberry"), ()=>browser = "stock"); runTest("isAndroidWebview", browser === "Chrome" && context === "browser" && Flags.webview, ()=>context = "webview"); runTest("isFirefoxOS", browser === "Firefox" && os === UNKNOWN, ()=>os = "Firefox OS"); runTest("isAndroidFallback", os === UNKNOWN && !Flags.windowsTizen && Flags.android, ()=>os = "Android"); runTest("isTridentFallback", os === UNKNOWN && Flags.trident, ()=>engine = "Trident"); runTest("isWebkitFallback", os === UNKNOWN && Flags.webkit, ()=>engine = "WebKit"); runTest("is64Bit", (is64=>{ return is64.test(UA) || is64.test(navigator.platform) || navigator.cpuClass === "x64" } )(/x86_64|x86-64|win64|x64;|x64\)|x64_|amd64|wow64|ia64|arm64|arch64|sparc64|ppc64|irix64/i), ()=>os_arch = "64-bit"); runTest("is32Bit", (is32=>{ return is32.test(UA) || is32.test(navigator.platform) || navigator.cpuClass === "x86" } )(/x86;|x86\)|i86|i386|i486|i586|i686|armv1|armv2|armv3|armv4|armv5|armv6|armv7/i), ()=>os_arch = "32-bit"); runTest("is64BitFallback", os_arch === UNKNOWN && os === "Mac OS X" && parseFloat(os_version) >= 10.7, ()=>os_arch = "64-bit"); runTest("is32BitFallback", os_arch === UNKNOWN && os === "Windows" || os === "Android" && parseFloat(os_version) < 5, ()=>os_arch = "32-bit"); runTest("is32BitBrowser", os_arch === "32-bit" || /wow64/i.test(UA), ()=>browser_arch = "32-bit"); runTest("is64BitBrowser", /win64/i.test(UA), ()=>browser_arch = "64-bit"); runTest("isDesktop", (()=>{ return os === "Windows" || os === "Mac OS X" || os === "Linux" || os === "Chrome OS" || context === "nwjs" } )(), ()=>is_desktop = true); if (engine === "Edge" && typeof Windows !== "undefined" && typeof Windows["System"] !== "undefined") context = "windows-store"; is_desktop_app = context === "nwjs"; const is_ipad_os = os === "Mac OS X" && navigator["maxTouchPoints"] && navigator["maxTouchPoints"] > 2; if (is_ipad_os) { os = "iOS"; os_version = browser_version; is_desktop = false; is_desktop_app = false } C3.Platform = { OS: os, OSVersion: os_version, OSArchitecture: os_arch, Browser: browser, BrowserVersion: browser_version, BrowserVersionNumber: parseFloat(browser_version), BrowserArchitecture: browser_arch, BrowserEngine: engine, Context: context, IsDesktop: is_desktop, IsMobile: !is_desktop, IsDesktopApp: is_desktop_app, IsChromeWebStore: !!(self["chrome"] && self["chrome"]["runtime"] && self["chrome"]["runtime"]["id"]), IsAppleOS: os === "Mac OS X" || os === "iOS", IsIpadOS: is_ipad_os } } ;'use strict'; { const VERSION = 2; const STORE_NAME = "keyvaluepairs"; const DATABASE_PROMISE_MAP = new Map; const SUPPORTS_GETALL = typeof IDBObjectStore !== "undefined" && typeof IDBObjectStore.prototype.getAll === "function"; const SUPPORTS_GETALLKEYS = typeof IDBObjectStore !== "undefined" && typeof IDBObjectStore.prototype.getAllKeys === "function"; function asyncifyRequest(request) { return new Promise((res,rej)=>{ request.onsuccess = ()=>res(request.result); request.onerror = ()=>rej(request.error) } ) } function asyncifyTransaction(tx) { return new Promise((res,rej)=>{ tx.oncomplete = ()=>res(); tx.onerror = ()=>rej(tx.error); tx.onabort = ()=>rej(tx.error) } ) } function openReadOnlyTransaction(name, method) { return openTransaction(name, method) } function openWriteTransaction(name, method) { return openTransaction(name, method, true) } async function openTransaction(name, method, write=false, allowRetry=true) { const db = await lazyOpenDatabase(name); try { const tx = db.transaction([STORE_NAME], write ? "readwrite" : "readonly"); return method(tx) } catch (err) { if (allowRetry && err["name"] === "InvalidStateError") { DATABASE_PROMISE_MAP.delete(name); return openTransaction(name, method, write, false) } else throw err; } } function lazyOpenDatabase(name) { RequireString(name); let dbPromise = DATABASE_PROMISE_MAP.get(name); if (!(dbPromise instanceof Promise)) { dbPromise = openDatabase(name); DATABASE_PROMISE_MAP.set(name, dbPromise); dbPromise.catch(err=>DATABASE_PROMISE_MAP.delete(name)) } return dbPromise } async function openDatabase(name) { RequireString(name); const openRequest = indexedDB.open(name, VERSION); openRequest.addEventListener("upgradeneeded", e=>{ try { const db = e.target.result; db.createObjectStore(STORE_NAME) } catch (err) { console.error(`Failed to create objectstore for database ${name}`, err) } } ); return asyncifyRequest(openRequest) } function RequireString(x) { if (typeof x !== "string") throw new TypeError("expected string"); } function getEntriesFromCursor(tx, type) { const request = tx.objectStore(STORE_NAME).openCursor(); return new Promise(resolve=>{ const results = []; request.onsuccess = event=>{ const cursor = event.target.result; if (cursor) { switch (type) { case "entries": results.push([cursor.key, cursor.value]); break; case "keys": results.push(cursor.key); break; case "values": results.push(cursor.value); break } cursor.continue() } else resolve(results) } } ) } class KVStorageContainer { constructor(name) { RequireString(name); this.name = name } async ready() { await lazyOpenDatabase(this.name) } set(key, value) { RequireString(key); return openWriteTransaction(this.name, async tx=>{ const request = tx.objectStore(STORE_NAME).put(value, key); const requestPromise = asyncifyRequest(request); const txPromise = asyncifyTransaction(tx); await Promise.all([txPromise, requestPromise]) } ) } get(key) { RequireString(key); return openReadOnlyTransaction(this.name, async tx=>{ const request = tx.objectStore(STORE_NAME).get(key); const requestPromise = asyncifyRequest(request); const txPromise = asyncifyTransaction(tx); const [_,value] = await Promise.all([txPromise, requestPromise]); return value } ) } delete(key) { RequireString(key); return openWriteTransaction(this.name, async tx=>{ const request = tx.objectStore(STORE_NAME).delete(key); const requestPromise = asyncifyRequest(request); const txPromise = asyncifyTransaction(tx); await Promise.all([txPromise, requestPromise]) } ) } clear() { return openWriteTransaction(this.name, async tx=>{ const request = tx.objectStore(STORE_NAME).clear(); const requestPromise = asyncifyRequest(request); const txPromise = asyncifyTransaction(tx); await Promise.all([txPromise, requestPromise]) } ) } keys() { return openReadOnlyTransaction(this.name, async tx=>{ let requestPromise; if (SUPPORTS_GETALLKEYS) { const request = tx.objectStore(STORE_NAME).getAllKeys(); requestPromise = asyncifyRequest(request) } else requestPromise = getEntriesFromCursor(tx, "keys"); const txPromise = asyncifyTransaction(tx); const [_,value] = await Promise.all([txPromise, requestPromise]); return value } ) } values() { return openReadOnlyTransaction(this.name, async tx=>{ let requestPromise; if (SUPPORTS_GETALL) { const request = tx.objectStore(STORE_NAME).getAll(); requestPromise = asyncifyRequest(request) } else requestPromise = getEntriesFromCursor(tx, "values"); const txPromise = asyncifyTransaction(tx); const [_,value] = await Promise.all([txPromise, requestPromise]); return value } ) } entries() { return openReadOnlyTransaction(this.name, async tx=>{ const requestPromise = getEntriesFromCursor(tx, "entries"); const txPromise = asyncifyTransaction(tx); const [_,value] = await Promise.all([txPromise, requestPromise]); return value } ) } } self.KVStorageContainer = KVStorageContainer } ;'use strict'; { const KVStorageContainer = self.KVStorageContainer; const CRITICAL_ERRORS = [/no available storage method found/i, /an attempt was made to break through the security policy of the user agent/i, /the user denied permission to access the database/i, /a mutation operation was attempted on a database that did not allow mutations/i, /idbfactory\.open\(\) called in an invalid security context/i]; const memoryStorage = new WeakMap; let isInMemory = false; if (typeof indexedDB === "undefined") { isInMemory = true; console.warn("Unable to use local storage because indexedDB is not defined") } function NOT_IMPLEMENTED(name) { throw new Error(`"${name}" is not implemented`); } function DISALLOW_CALLBACK(fn) { if (typeof fn === "function") throw new Error(`localforage callback API is not implemented; please use the promise API instead`); } function StructuredClone(value) { if (typeof value === "object") return new Promise(resolve=>{ const {port1, port2} = new MessageChannel; port2.onmessage = ev=>resolve(ev.data); port1.postMessage(value) } ); else return Promise.resolve(value) } class ForageAdaptor { constructor(inst) { this._inst = inst; memoryStorage.set(this, new Map) } _MaybeSwitchToMemoryFallback(err) { if (isInMemory) return; for (const regex of CRITICAL_ERRORS) if (err && regex.test(err.message)) { console.error("Unable to use local storage, reverting to in-memory store: ", err, err.message); isInMemory = true; break } } async _getItemFallback(name) { const value = memoryStorage.get(this).get(name); const ret = await StructuredClone(value); return typeof ret === "undefined" ? null : ret } async _setItemFallback(name, value) { value = await StructuredClone(value); memoryStorage.get(this).set(name, value) } _removeItemFallback(name) { memoryStorage.get(this).delete(name) } _clearFallback() { memoryStorage.get(this).clear() } _keysFallback() { return Array.from(memoryStorage.get(this).keys()) } IsUsingFallback() { return isInMemory } async getItem(key, successCallback) { DISALLOW_CALLBACK(successCallback); if (isInMemory) return await this._getItemFallback(key); let result; try { result = await this._inst.get(key) } catch (err) { this._MaybeSwitchToMemoryFallback(err); if (isInMemory) return await this._getItemFallback(key); else { console.error(`Error reading '${key}' from storage, returning null: `, err); return null } } return typeof result === "undefined" ? null : result } async setItem(key, value, successCallback) { DISALLOW_CALLBACK(successCallback); if (typeof value === "undefined") value = null; if (isInMemory) { await this._setItemFallback(key, value); return } try { await this._inst.set(key, value) } catch (err) { this._MaybeSwitchToMemoryFallback(err); if (isInMemory) await this._setItemFallback(key, value); else throw err; } } async removeItem(key, successCallback) { DISALLOW_CALLBACK(successCallback); if (isInMemory) { this._removeItemFallback(key); return } try { await this._inst.delete(key) } catch (err) { this._MaybeSwitchToMemoryFallback(err); if (isInMemory) this._removeItemFallback(key); else console.error(`Error removing '${key}' from storage: `, err) } } async clear(successCallback) { DISALLOW_CALLBACK(successCallback); if (isInMemory) { this._clearFallback(); return } try { await this._inst.clear() } catch (err) { this._MaybeSwitchToMemoryFallback(err); if (isInMemory) this._clearFallback(); else console.error(`Error clearing storage: `, err) } } async keys(successCallback) { DISALLOW_CALLBACK(successCallback); if (isInMemory) return this._keysFallback(); let result = []; try { result = await this._inst.keys() } catch (err) { this._MaybeSwitchToMemoryFallback(err); if (isInMemory) return this._keysFallback(); else console.error(`Error getting storage keys: `, err) } return result } ready(successCallback) { DISALLOW_CALLBACK(successCallback); if (isInMemory) return Promise.resolve(true); else return this._inst.ready() } createInstance(options) { if (typeof options !== "object") throw new TypeError("invalid options object"); const name = options["name"]; if (typeof name !== "string") throw new TypeError("invalid store name"); const inst = new KVStorageContainer(name); return new ForageAdaptor(inst) } length(successCallback) { NOT_IMPLEMENTED("localforage.length()") } key(index, successCallback) { NOT_IMPLEMENTED("localforage.key()") } iterate(iteratorCallback, successCallback) { NOT_IMPLEMENTED("localforage.iterate()") } setDriver(driverName) { NOT_IMPLEMENTED("localforage.setDriver()") } config(options) { NOT_IMPLEMENTED("localforage.config()") } defineDriver(customDriver) { NOT_IMPLEMENTED("localforage.defineDriver()") } driver() { NOT_IMPLEMENTED("localforage.driver()") } supports(driverName) { NOT_IMPLEMENTED("localforage.supports()") } dropInstance() { NOT_IMPLEMENTED("localforage.dropInstance()") } disableMemoryMode() { isInMemory = false } } self["localforage"] = new ForageAdaptor(new KVStorageContainer("localforage")) } ;'use strict'; { const C3 = self.C3; C3.Supports = {}; C3.Supports.WebAnimations = (()=>{ try { if (C3.Platform.Browser === "Safari") return false; if (typeof document === "undefined") return false; const e = document.createElement("div"); if (typeof e.animate === "undefined") return false; const player = e.animate([{ opacity: "0" }, { opacity: "1" }], 1E3); return typeof player.reverse !== "undefined" } catch (e) { return false } } )(); C3.Supports.DialogElement = typeof HTMLDialogElement !== "undefined"; C3.Supports.RequestIdleCallback = !!self.requestIdleCallback; C3.Supports.ImageBitmap = !!self.createImageBitmap; C3.Supports.ImageBitmapOptions = false; if (C3.Supports.ImageBitmap) try { self.createImageBitmap(new ImageData(32,32), { premultiplyAlpha: "none" }).then(imageBitmap=>{ C3.Supports.ImageBitmapOptions = true } ).catch(err=>{ C3.Supports.ImageBitmapOptions = false } ) } catch (e) { C3.Supports.ImageBitmapOptions = false } C3.Supports.ClipboardReadText = !!(navigator["clipboard"] && navigator["clipboard"]["readText"] && C3.Platform.Browser !== "Firefox"); C3.Supports.PermissionsQuery = !!(navigator["permissions"] && navigator["permissions"]["query"]); C3.Supports.Proxies = typeof Proxy !== "undefined"; C3.Supports.DownloadAttribute = (()=>{ if (typeof document === "undefined") return false; const a = document.createElement("a"); return typeof a.download !== "undefined" } )(); C3.Supports.CanvasToBlob = (()=>{ return typeof HTMLCanvasElement !== "undefined" && HTMLCanvasElement.prototype.toBlob } )(); C3.Supports.Fetch = typeof fetch === "function"; C3.Supports.PersistentStorage = !!(self.isSecureContext && C3.Platform.Browser !== "Opera" && (navigator["storage"] && navigator["storage"]["persist"])); C3.Supports.StorageQuotaEstimate = !!(self.isSecureContext && (navigator["storage"] && navigator["storage"]["estimate"])); C3.Supports.Fullscreen = (()=>{ if (typeof document === "undefined") return false; if (C3.Platform.OS === "iOS") return false; const elem = document.documentElement; return !!(elem.requestFullscreen || elem.msRequestFullscreen || elem.mozRequestFullScreen || elem.webkitRequestFullscreen) } )(); C3.Supports.ImageDecoder = typeof self["ImageDecoder"] !== "undefined"; C3.Supports.NativeFileSystemAPI = !!self["showOpenFilePicker"]; C3.Supports.NavigatorFontsQuery = !!(navigator["fonts"] && navigator["fonts"]["query"]) } ;'use strict'; { const C3 = self.C3; if (!String.prototype.trimStart) { const startWhitespace = /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]*/; String.prototype.trimStart = function trimStart() { return this.replace(startWhitespace, "") } } if (!String.prototype.trimEnd) { const endWhitespace = /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]*$/; String.prototype.trimEnd = function trimEnd() { return this.replace(endWhitespace, "") } } if (!String.prototype.replaceAll) String.prototype.replaceAll = function replaceAll(find, replace) { return this.replace(new RegExp(C3.EscapeRegex(find),"g"), replace) } ; if (!Array.prototype.values) Array.prototype.values = function*() { for (const i of this) yield i } ; if (!Array.prototype.flat) { function arrayFlat(arr, depth) { return arr.reduce((acc,val)=>{ if (depth > 0 && Array.isArray(val)) { Array.prototype.push.apply(acc, arrayFlat(val, depth - 1)); return acc } else { acc.push(val); return acc } } , []) } Array.prototype.flat = function(depth=1) { return arrayFlat(this, depth) } } if (!RegExp.escape) RegExp.escape = function(s) { return String(s).replace(/[\\^$*+?.()|[\]{}]/g, "\\$&") } ; if (navigator["storage"] && !navigator["storage"]["estimate"] && navigator["webkitTemporaryStorage"] && navigator["webkitTemporaryStorage"]["queryUsageAndQuota"]) navigator["storage"]["estimate"] = function() { return new Promise((resolve,reject)=>{ return navigator["webkitTemporaryStorage"]["queryUsageAndQuota"]((usage,quota)=>resolve({ "usage": usage, "quota": quota }), reject) } ) } ; if (typeof HTMLCollection !== "undefined" && !HTMLCollection.prototype[Symbol.iterator]) HTMLCollection.prototype[Symbol.iterator] = function() { let i = 0; return { next: ()=>{ if (i >= this.length) return { done: true }; else return { value: this.item(i++), done: false } } } } ; if (typeof NodeList !== "undefined" && !NodeList.prototype[Symbol.iterator]) NodeList.prototype[Symbol.iterator] = function() { let i = 0; return { next: ()=>{ if (i >= this.length) return { done: true }; else return { value: this.item(i++), done: false } } } } ; if (typeof DOMTokenList !== "undefined" && !DOMTokenList.prototype[Symbol.iterator]) DOMTokenList.prototype[Symbol.iterator] = function() { let i = 0; return { next: ()=>{ if (i >= this.length) return { done: true }; else return { value: this.item(i++), done: false } } } } ; if (typeof FileList !== "undefined" && !FileList.prototype[Symbol.iterator]) FileList.prototype[Symbol.iterator] = function() { let i = 0; return { next: ()=>{ if (i >= this.length) return { done: true }; else return { value: this.item(i++), done: false } } } } ; if (typeof TextEncoder === "undefined") { self.TextEncoder = class TextEncoder { constructor() { Object.defineProperty(this, "encoding", { "value": "utf-8", "writable": false }) } encode(str) { var Len = str.length , resPos = -1; var resArr = new Uint8Array(Len * 3); for (var point = 0, nextcode = 0, i = 0; i !== Len; ) { point = str.charCodeAt(i), i += 1; if (point >= 55296 && point <= 56319) { if (i === Len) { resArr[resPos += 1] = 239; resArr[resPos += 1] = 191; resArr[resPos += 1] = 189; break } nextcode = str.charCodeAt(i); if (nextcode >= 56320 && nextcode <= 57343) { point = (point - 55296) * 1024 + nextcode - 56320 + 65536; i += 1; if (point > 65535) { resArr[resPos += 1] = 30 << 3 | point >>> 18; resArr[resPos += 1] = 2 << 6 | point >>> 12 & 63; resArr[resPos += 1] = 2 << 6 | point >>> 6 & 63; resArr[resPos += 1] = 2 << 6 | point & 63; continue } } else { resArr[resPos += 1] = 239; resArr[resPos += 1] = 191; resArr[resPos += 1] = 189; continue } } if (point <= 127) resArr[resPos += 1] = 0 << 7 | point; else if (point <= 2047) { resArr[resPos += 1] = 6 << 5 | point >>> 6; resArr[resPos += 1] = 2 << 6 | point & 63 } else { resArr[resPos += 1] = 14 << 4 | point >>> 12; resArr[resPos += 1] = 2 << 6 | point >>> 6 & 63; resArr[resPos += 1] = 2 << 6 | point & 63 } } return new Uint8Array(resArr.buffer.slice(0, resPos + 1)) } toString() { return "[object TextEncoder]" } } ; TextEncoder[Symbol.toStringTag] = "TextEncoder" } if (typeof TextDecoder === "undefined") { function persist(iterable) { const itr = iterable[Symbol.iterator](); return { next: _=>itr.next(), [Symbol.iterator]() { return this } } } function readNext(bytes) { const n = bytes.next(); if (n.done) throw new Error("unexpected end of input"); if ((n.value & 192 ^ 128) != 0) throw new Error("invalid byte"); return n.value & 63 } const _decoders = new Map; _decoders.set("utf-8", (arr,fatal)=>{ let view; if (arr.buffer) view = new Uint8Array(arr.buffer,arr.byteOffset,arr.byteLength); else if (view instanceof ArrayBuffer) view = new Uint8Array(arr); else throw new Error("Invalid parameter"); const bytes = persist(view); const result = []; try { for (const ch of bytes) { let val; if (ch < 127) val = ch & 127; else if (ch < 223) val = (ch & 31) << 6 | readNext(bytes); else if (ch < 239) val = (ch & 15) << 12 | readNext(bytes) << 6 | readNext(bytes); else if (ch < 247) val = (ch & 7) << 18 | readNext(bytes) << 12 | readNext(bytes) << 6 | readNext(bytes); else throw new Error("Invalid character"); result.push(String.fromCodePoint(val)) } } catch (e) { if (fatal) throw e; result.push("\ufffd") } return result.join("") } ); _decoders.set("utf8", _decoders.get("utf-8")); _decoders.set("utf-16le", (arr,fatal)=>{ throw new Error("utf-16le decoder not implemented"); } ); self.TextDecoder = class TextDecoder { constructor(label="utf-8", options={}) { const decoder = _decoders.get(label); if (!decoder) throw new Error(`TextDecoder polyfill does not support "${label}"`); Object.defineProperty(this, "fatal", { "value": options["fatal"] === true, "writable": false }); Object.defineProperty(this, "_decoder", { "value": decoder, "writable": false }); Object.defineProperty(this, "encoding", { "value": label, "writable": false }) } decode(arr) { return this["_decoder"](arr, this["fatal"]) } toString() { return "[object TextDecoder]" } } ; TextDecoder[Symbol.toStringTag] = "TextDecoder" } if (typeof self.isSecureContext === "undefined") self.isSecureContext = location.protocol === "https:"; if (typeof self["globalThis"] === "undefined") self["globalThis"] = self } ;'use strict'; { const C3 = self.C3; function assertFail(msg_) { let stack = C3.GetCallStack(); let msg = "Assertion failure: " + msg_ + "\n\nStack trace:\n" + stack; console.error(msg) } self.assert = function assert(cnd_, msg_) { if (!cnd_) assertFail(msg_) } } ;'use strict'; { const C3 = self.C3; C3.IsNumber = function IsNumber(x) { return typeof x === "number" } ; C3.IsFiniteNumber = function IsFiniteNumber(x) { return C3.IsNumber(x) && isFinite(x) } ; C3.RequireNumber = function RequireNumber(x) { if (!C3.IsNumber(x)) throw new TypeError("expected number"); } ; C3.RequireOptionalNumber = function RequireOptionalNumber(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireNumberInRange = function RequireNumberInRange(x, low, high) { if (!C3.IsNumber(x) || isNaN(x) || low > x || high < x) throw new RangeError("number outside of range"); } ; C3.RequireAllNumber = function RequireAllNumber(...args) { for (let a of args) ; } ; C3.RequireFiniteNumber = function RequireFiniteNumber(x) { if (!C3.IsFiniteNumber(x)) throw new TypeError("expected finite number"); } ; C3.RequireOptionalFiniteNumber = function RequireOptionalFiniteNumber(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllFiniteNumber = function RequireAllFiniteNumber(...args) { for (let a of args) ; } ; C3.IsString = function IsString(x) { return typeof x === "string" } ; C3.RequireString = function RequireString(x) { if (!C3.IsString(x)) throw new TypeError("expected string"); } ; C3.RequireOptionalString = function RequireOptionalString(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllString = function RequireAllString(...args) { for (let a of args) ; } ; C3.IsSimpleObject = function IsSimpleObject(x) { if (typeof x !== "object" || x === null) return false; let proto = Object.getPrototypeOf(x); return proto ? proto.constructor === Object : proto === null } ; C3.RequireSimpleObject = function RequireSimpleObject(x) { if (!C3.IsSimpleObject(x)) throw new TypeError("expected simple object"); } ; C3.RequireOptionalSimpleObject = function RequireSimpleObject(x) { if (C3.IsNullOrUndefined(x)) return; if (!C3.IsSimpleObject(x)) throw new TypeError("expected simple object"); } ; C3.IsObject = function IsObject(x) { return typeof x === "object" && x !== null && !Array.isArray(x) } ; C3.RequireObject = function RequireObject(x) { if (!C3.IsObject(x)) throw new TypeError("expected object"); } ; C3.RequireOptionalObject = function RequireOptionalObject(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllObject = function RequireAllObject(...args) { for (let a of args) ; } ; C3.IsFileLike = function IsFileLike(x) { return C3.IsInstanceOf(x, Blob) && typeof x["name"] === "string" } ; C3.RequireFileLike = function RequireFileLike(x) { if (!C3.IsFileLike(x)) throw new TypeError("expected file"); } ; C3.RequireOptionalFileLike = function RequireOptionalFileLike(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.IsArray = function IsArray(x) { return Array.isArray(x) } ; C3.RequireArray = function RequireArray(x) { if (!C3.IsArray(x)) throw new TypeError("expected array"); } ; C3.RequireOptionalArray = function RequireOptionalArray(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllArray = function RequireAllArray(...args) { for (let a of args) ; } ; C3.Is2DArray = function(x) { if (!C3.IsArray(x)) return false; if (!x.length) return true; if (!C3.IsArray(x[0])) return false; return true } ; C3.Require2DArray = function Require2DArray(x) { if (!C3.Is2DArray(x)) throw new TypeError("expected 2d array"); for (let arr of x) if (!C3.IsArray(arr)) throw new TypeError("expected 2d array"); } ; C3.RequireOptional2DArray = function Require2DArray(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.IsFunction = function IsFunction(x) { return typeof x === "function" } ; C3.RequireFunction = function RequireFunction(x, f) { if (!C3.IsFunction(x)) throw new TypeError("expected function"); if (!C3.IsNullOrUndefined(f)) if (x !== f) throw new TypeError("expected same function reference"); } ; C3.RequireOptionalFunction = function RequireOptionalFunction(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllFunction = function RequireAllFunction(...args) { for (let a of args) ; } ; C3.RequireAnyFunction = function RequireAllFunction(x, ...args) { if (!C3.IsFunction(x)) throw new TypeError("expected function"); if (!args.length) throw new Error("missing comparison functions"); for (let a of args) if (!C3.IsNullOrUndefined(a)) if (x === a) return; throw new TypeError("expected same function reference"); } ; C3.RequireOptionalAllFunction = function RequireAllFunction(...args) { if (C3.IsNullOrUndefined(args)) return; for (let a of args) ; } ; C3.IsInstanceOf = function IsInstanceOf(x, t) { return x instanceof t } ; C3.IsInstanceOfAny = function IsInstanceOfAny(x, ...args) { for (let t of args) if (C3.IsInstanceOf(x, t)) return true; return false } ; C3.RequireInstanceOf = function RequireInstanceOf(x, t) { if (!C3.IsInstanceOf(x, t)) throw new TypeError("unexpected type"); } ; C3.RequireOptionalInstanceOf = function RequireOptionalInstanceOf(x, t) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllInstanceOf = function RequireAllInstanceOf(t, ...args) { for (let a of args) ; } ; C3.RequireAnyInstanceOf = function RequireAnyInstanceOf(x, ...args) { if (!C3.IsInstanceOfAny(x, ...args)) throw new TypeError("unexpected type"); } ; C3.RequireAnyOptionalInstanceOf = function RequireAnyOptionalInstanceOf(x, ...args) { if (C3.IsNullOrUndefined(x)) return; if (!C3.IsInstanceOfAny(x, ...args)) throw new TypeError("unexpected type"); } ; C3.IsArrayOf = function IsArrayOf(x, t) { for (let i of x) if (!C3.IsInstanceOf(i, t)) return false; return true } ; C3.IsArrayOfFiniteNumbers = function IsArrayOf(x) { for (let i of x) if (!C3.IsFiniteNumber(i)) return false; return true } ; C3.RequireArrayOf = function RequireArrayOf(x, t) { for (let i of x) ; } ; C3.RequireOptionalArrayOf = function RequireOptionalArrayOf(x, t) { if (C3.IsNullOrUndefined(x)) return; for (let i of x) ; } ; C3.RequireArrayOfAny = function RequireArrayOf(x, ...args) { for (let i of x) ; } ; C3.RequireOptionalArrayOfAny = function RequireOptionalArrayOfAny(x, ...args) { if (C3.IsNullOrUndefined(x)) return; for (let i of x) ; } ; C3.IsDOMNode = function IsDOMNode(d, n) { if (C3.IsNullOrUndefined(d) || !C3.IsString(d.nodeName)) return false; return !n || C3.equalsNoCase(d.nodeName, n) } ; C3.RequireDOMNode = function RequireDOMNode(d, n) { if (C3.IsNullOrUndefined(d) || !C3.IsString(d.nodeName)) throw new TypeError("expected DOM node"); if (n && !C3.equalsNoCase(d.nodeName, n)) throw new TypeError(`expected DOM '${n}' node`); } ; C3.RequireOptionalDOMNode = function RequireOptionalDOMNode(d, n) { if (C3.IsNullOrUndefined(d)) return } ; C3.IsHTMLElement = function IsHTMLElement(e, t) { if (C3.IsNullOrUndefined(e) || !C3.IsString(e.tagName)) return false; return !t || C3.equalsNoCase(e.tagName, t) } ; C3.RequireHTMLElement = function RequireHTMLElement(e, t) { if (C3.IsNullOrUndefined(e) || !C3.IsString(e.tagName)) throw new TypeError("expected HTML element"); if (t && !C3.equalsNoCase(e.tagName, t)) throw new TypeError(`expected HTML '${t}' element`); } ; C3.RequireOptionalHTMLElement = function RequireOptionalHTMLElement(e, t) { if (C3.IsNullOrUndefined(e)) return } ; C3.IsDrawable = function IsDrawable(d) { return C3.IsHTMLElement(d, "img") || C3.IsHTMLElement(d, "canvas") || C3.IsHTMLElement(d, "video") || typeof OffscreenCanvas !== "undefined" && d instanceof OffscreenCanvas || typeof ImageBitmap !== "undefined" && d instanceof ImageBitmap } ; C3.RequireDrawable = function RequireDrawable(d) { if (!C3.IsDrawable(d)) throw new TypeError("expected drawable"); } ; C3.RequireOptionalDrawable = function RequireOptionalDrawable(d) { if (C3.IsNullOrUndefined(d)) return } ; C3.IsDrawableOrImageData = function IsDrawableOrImageData(x) { if (x instanceof ImageData) return true; return C3.IsDrawable(x) } ; C3.RequireDrawableOrImageData = function RequireDrawableOrImageData(d) { if (!C3.IsDrawableOrImageData(d)) throw new TypeError("expected drawable or image data"); } ; C3.RequireOptionalDrawableOrImageData = function RequireOptionalDrawableOrImageData(d) { if (C3.IsNullOrUndefined(d)) return; if (!C3.IsDrawableOrImageData(d)) throw new TypeError("expected drawable or image data"); } ; C3.IsStringLike = function IsStringLike(x) { return typeof x === "string" || x instanceof C3.HtmlString || x instanceof C3.BBString } ; C3.RequireStringLike = function RequireStringLike(x) { if (!C3.IsStringLike(x)) throw new TypeError("expected string-like"); } ; C3.RequireOptionalStringLike = function RequireOptionalStringLike(x) { if (C3.IsNullOrUndefined(x)) return } ; C3.RequireAllStringLike = function RequireAllStringLike(...args) { for (let a of args) ; } ; C3.RequireOverride = function RequireOverride() { throw new Error("must be overridden"); } ; C3.NotYetImplemented = function NotYetImplemented() { throw new Error("not yet implemented"); } ; C3.IsDefined = function isDefined(obj, ...follow) { let currentObject = obj; if (typeof currentObject === "undefined") return false; for (let key of follow) { if (typeof currentObject[key] === "undefined") return false; currentObject = currentObject[key] } return true } ; C3.IsNullOrUndefined = function(x) { return typeof x === "undefined" || x === null } ; C3.AreArrayElementsOfSameType = function(arr) { let type = arr[0].constructor; for (let x of arr) if (x.constructor !== type) return false; return type } ; C3.AreArrayElementsOfType = function(arr, t) { for (let x of arr) if (!(x instanceof t)) return false; return true } ; const TypedArray = Object.getPrototypeOf(Uint8Array); C3.IsTypedArray = function(view) { return C3.IsInstanceOf(view, TypedArray) } ; C3.RequireTypedArray = function(view) {} ; C3.WeakRequireTypedArray = function WeakRequireTypedArray(inst) { C3.WeakRequireInstanceOf(inst, TypedArray) } ; C3.WeakRequireAnyInstanceOf = function WeakRequireAnyInstanceOf(inst, ...ctors) { if (!C3.WeakIsAnyInstanceOf(inst, ...ctors)) throw new TypeError("unexpected type"); } ; C3.WeakIsAnyInstanceOf = function WeakIsAnyInstanceOf(inst, ...ctors) { for (const ctor of ctors) if (C3.WeakIsInstanceOf(inst, ctor)) return true; return false } ; C3.WeakRequireInstanceOf = function WeakRequireInstanceOf(inst, ctor) { if (!C3.WeakIsInstanceOf(inst, ctor)) throw new TypeError("unexpected type"); } ; C3.WeakIsInstanceOf = function WeakIsInstanceOf(inst, ctor) { while (inst = Object.getPrototypeOf(inst)) if (inst.constructor.name === ctor.name) return true; return false } } ;'use strict'; { const C3 = self.C3; C3.GetCallStack = function GetCallStack() { return (new Error).stack } ; C3.Debugger = function Debugger() { debugger } ; C3.cast = function cast(o, T) { if (o && o instanceof T) return o; else return null } ; C3.getName = function getName(o) { if (typeof o === "undefined") return "undefined"; if (o === null) return "null"; if (typeof o === "boolean") return ""; if (C3.IsNumber(o)) return ""; if (C3.IsString(o)) return ""; if (C3.IsArray(o)) return ""; if (typeof o === "symbol") return "<" + o.toString() + ">"; if (C3.IsFunction(o)) { if (o.name && o.name !== "Function") return o.name; return "" } if (typeof o === "object") { if (o.constructor && o.constructor.name && o.constructor.name !== "Object") return o.constructor.name; return "" } return "" } ; C3.getType = function getType(o) { if (o === null) return "null"; if (Array.isArray(o)) return "array"; return typeof o } ; C3.range = function *range(a, b) { if (!isFinite(Math.abs(a - b))) throw new Error("Invalid parameters"); if (a > b) for (let i = a - 1; i >= b; i--) yield i; else for (let i = a; i < b; i++) yield i } ; function isValidTypeChange(from, to) { let fromType = C3.getType(from); let toType = C3.getType(to); if (fromType === "null" || toType === "null") return true; if (fromType === "undefined" || toType === "undefined") return false; return fromType === toType } let ctorObjectToProxy = new Map; let ctorProxyToObject = new Map; let proxyToObject = new WeakMap; let releasedObjects = new WeakMap; C3.DefendHandler = {}; const VALID_GET_MISSING_KEYS = new Set(["then", "splice"]); function logDefendedObjectWarning(msg) { console.warn("[Defence] " + msg + " @", C3.GetCallStack()) } C3.DefendHandler.get = function defended_get(target, key) { if (!(key in target) && typeof key !== "symbol" && !VALID_GET_MISSING_KEYS.has(key)) logDefendedObjectWarning(`Accessed missing property '${key}' from defended object '${C3.getName(target)}', returning undefined`); if (releasedObjects.has(target) && typeof key !== "symbol" && !VALID_GET_MISSING_KEYS.has(key)) logDefendedObjectWarning(`Accessed property '${key}' on a released object '${C3.getName(target)}'\nObject was originally released at: ${releasedObjects.get(target)})\nCall stack at access: `); return target[key] } ; C3.DefendHandler.set = function defended_set(target, key, value) { if (!(key in target) && !ctorObjectToProxy.has(target)) logDefendedObjectWarning(`Set non-existent property '${key}' to '${value}' on defended object '${C3.getName(target)}'`); if (!isValidTypeChange(target[key], value) && !ctorObjectToProxy.has(target)) logDefendedObjectWarning(`Set '${C3.getType(target[key])}' property '${key}' to type '${C3.getType(value)}' on defended object '${C3.getName(target)}'`); if (releasedObjects.has(target)) logDefendedObjectWarning(`Set property '${key}' on a released object '${C3.getName(target)}'\nObject was originally released at: ${releasedObjects.get(target)})\nCall stack at access: `); target[key] = value; return true } ; C3.DefendHandler.deleteProperty = function defended_deleteProperty(target, key) { throw new ReferenceError(`Cannot delete property '${key}' from defended object '${C3.getName(target)}'`); } ; C3.DefendHandler.defineProperty = function defended_defineProperty(target, key, desc) { throw new ReferenceError(`Cannot define property '${key}' on defended object '${C3.getName(target)}'`); } ; C3.DefendHandler.enumerate = function defended_enumerate(target) { throw new ReferenceError(`Cannot enumerate defended object '${C3.getName(target)}'`); } ; let checkRafId = -1; function CheckDefendedObjectsUsedCorrectly() { checkRafId = -1; if (ctorObjectToProxy.size > 0 || ctorProxyToObject.size > 0) { let uniqueNames = new Set([...ctorObjectToProxy.keys()].map(o=>C3.getName(o))); let leftoverNames = [...uniqueNames].join(","); console.warn(`An object derived from DefendedBase was not protected with debugDefend(). This will disable some checks. See the coding guidelines! Possible affected class names: ${leftoverNames}`); ctorObjectToProxy.clear(); ctorProxyToObject.clear() } } C3.DefendedBase = class DefendedBase { constructor() { if (!C3.isDebugDefend || !C3.Supports.Proxies) return; let newTarget = new.target; let realObject = Object.create(newTarget.prototype); let proxy = new Proxy(realObject,C3.DefendHandler); ctorObjectToProxy.set(realObject, proxy); ctorProxyToObject.set(proxy, realObject); proxyToObject.set(proxy, realObject); if (checkRafId === -1) checkRafId = requestAnimationFrame(CheckDefendedObjectsUsedCorrectly); return proxy } } ; C3.debugDefend = function debugDefend(o) { if (C3.isDebugDefend && C3.Supports.Proxies && o instanceof C3.DefendedBase) { if (!ctorProxyToObject.has(o)) return o; let realObject = ctorProxyToObject.get(o); ctorProxyToObject.delete(o); ctorObjectToProxy.delete(realObject); return o } else if (C3.isDebug) return Object.seal(o); else return o } ; C3.New = function New(Type, ...args) { let o; try { o = new Type(...args) } catch (e) { ctorProxyToObject.clear(); ctorObjectToProxy.clear(); throw e; } if (C3.isDebugDefend) VerifyObjectPropertiesConsistent(Type, o); return C3.debugDefend(o) } ; C3.Release = function Release(o) { let realObject = proxyToObject.get(o); if (realObject) releasedObjects.set(realObject, C3.GetCallStack()) } ; C3.WasReleased = function(o) { let realObject = proxyToObject.get(o); if (!realObject) return false; return !!releasedObjects.get(realObject) } ; let typeProperties = new Map; function getObjectPropertySet(o) { let ret = new Set; for (let k in o) ret.add(k); return ret } function VerifyObjectPropertiesConsistent(Type, o) { let properties = getObjectPropertySet(o); let existingProperties = typeProperties.get(Type); if (existingProperties) { let inconsistentProperties = []; for (let k of existingProperties.values()) if (properties.has(k)) properties.delete(k); else inconsistentProperties.push(k); C3.appendArray(inconsistentProperties, [...properties]); if (inconsistentProperties.length) console.warn(`[Defence] '${C3.getName(Type)}' constructor creates inconsistent properties: ${inconsistentProperties.join(", ")}`) } else typeProperties.set(Type, properties) } C3.PerfMark = class PerfMark { constructor(name) { this._name = ""; if (name) this.start(name) } start(name) { this._name = name; performance.mark(this._name + "-Start") } end() { performance.mark(this._name + "-End"); performance.measure(this._name, this._name + "-Start", this._name + "-End") } next(name) { this.end(); this._name = name; performance.mark(this._name + "-Start") } } } ;'use strict'; { const C3 = self.C3; const TWO_PI = Math.PI * 2; const D_TO_R = Math.PI / 180; const R_TO_D = 180 / Math.PI; C3.wrap = function wrap(x, min, max) { x = Math.floor(x); min = Math.floor(min); max = Math.floor(max); if (x < min) { let r = max - (min - x) % (max - min); return r === max ? 0 : r } else return min + (x - min) % (max - min) } ; C3.mapToRange = function mapToRange(x, inMin, inMax, outMin, outMax) { return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin } ; C3.normalize = function normalize(value, minimum, maximum) { return (value - minimum) / (maximum - minimum) } ; C3.clamp = function clamp(x, a, b) { if (x < a) return a; else if (x > b) return b; else return x } ; C3.clampAngle = function clampAngle(a) { a %= TWO_PI; if (a < 0) a += TWO_PI; return a } ; C3.toRadians = function toRadians(x) { return x * D_TO_R } ; C3.toDegrees = function toDegrees(x) { return x * R_TO_D } ; C3.distanceTo = function distanceTo(x1, y1, x2, y2) { return Math.hypot(x2 - x1, y2 - y1) } ; C3.distanceSquared = function distanceSquared(x1, y1, x2, y2) { const dx = x2 - x1; const dy = y2 - y1; return dx * dx + dy * dy } ; C3.angleTo = function angleTo(x1, y1, x2, y2) { return Math.atan2(y2 - y1, x2 - x1) } ; C3.angleDiff = function angleDiff(a1, a2) { if (a1 === a2) return 0; let s1 = Math.sin(a1); let c1 = Math.cos(a1); let s2 = Math.sin(a2); let c2 = Math.cos(a2); let n = s1 * s2 + c1 * c2; if (n >= 1) return 0; if (n <= -1) return Math.PI; return Math.acos(n) } ; C3.angleRotate = function angleRotate(start, end, step) { let ss = Math.sin(start); let cs = Math.cos(start); let se = Math.sin(end); let ce = Math.cos(end); if (Math.acos(ss * se + cs * ce) > step) if (cs * se - ss * ce > 0) return C3.clampAngle(start + step); else return C3.clampAngle(start - step); else return C3.clampAngle(end) } ; C3.angleClockwise = function angleClockwise(a1, a2) { let s1 = Math.sin(a1); let c1 = Math.cos(a1); let s2 = Math.sin(a2); let c2 = Math.cos(a2); return c1 * s2 - s1 * c2 <= 0 } ; C3.angleLerp = function angleLerp(a, b, x, r=0) { let diff = C3.angleDiff(a, b); const revs = TWO_PI * r; if (C3.angleClockwise(b, a)) return C3.clampAngle(a + (diff + revs) * x); else return C3.clampAngle(a - (diff + revs) * x) } ; C3.angleLerpClockwise = function angleLerpClockwise(a, b, x, r=0) { const diff = C3.angleDiff(a, b); const revs = TWO_PI * r; if (C3.angleClockwise(b, a)) return C3.clampAngle(a + (diff + revs) * x); return C3.clampAngle((TWO_PI - diff + revs) * x) } ; C3.angleLerpAntiClockwise = function angleLerpAntiClockwise(a, b, x, r=0) { const diff = C3.angleDiff(a, b); const revs = TWO_PI * r; if (C3.angleClockwise(b, a)) return C3.clampAngle((-TWO_PI + diff - revs) * x); return C3.clampAngle(a - (diff + revs) * x) } ; C3.lerp = function lerp(a, b, x) { return a + x * (b - a) } ; C3.unlerp = function unlerp(a, b, x) { if (a === b) return 0; return (x - a) / (b - a) } ; C3.relerp = function relerp(a, b, x, c, d) { return C3.lerp(c, d, C3.unlerp(a, b, x)) } ; C3.qarp = function qarp(a, b, c, x) { return C3.lerp(C3.lerp(a, b, x), C3.lerp(b, c, x), x) } ; C3.cubic = function cubic(a, b, c, d, x) { return C3.lerp(C3.qarp(a, b, c, x), C3.qarp(b, c, d, x), x) } ; C3.cosp = function cosp(a, b, x) { return (a + b + (a - b) * Math.cos(x * Math.PI)) / 2 } ; C3.isPOT = function isPOT(x) { return x > 0 && (x - 1 & x) === 0 } ; C3.nextHighestPowerOfTwo = function nextHighestPowerOfTwo(x) { --x; for (let i = 1; i < 32; i <<= 1) x = x | x >> i; return x + 1 } ; C3.roundToNearestFraction = function roundToNearestFraction(x, n) { return Math.round(x * n) / n } ; C3.floorToNearestFraction = function floorToNearestFraction(x, n) { return Math.floor(x * n) / n } ; C3.round6dp = function round6dp(x) { return Math.round(x * 1E6) / 1E6 } ; C3.toFixed = function toFixed(n, dp) { let ret = n.toFixed(dp); let last = ret.length - 1; for (; last >= 0 && ret.charAt(last) === "0"; --last) ; if (last >= 0 && ret.charAt(last) === ".") --last; if (last < 0) return ret; return ret.substr(0, last + 1) } ; C3.PackRGB = function PackRGB(red, green, blue) { return C3.clamp(red, 0, 255) | C3.clamp(green, 0, 255) << 8 | C3.clamp(blue, 0, 255) << 16 } ; const ALPHAEX_SHIFT = 1024; const ALPHAEX_MAX = 1023; const RGBEX_SHIFT = 16384; const RGBEX_MAX = 8191; const RGBEX_MIN = -8192; C3.PackRGBAEx = function PackRGBAEx(red, green, blue, alpha) { red = C3.clamp(Math.floor(red * 1024), RGBEX_MIN, RGBEX_MAX); green = C3.clamp(Math.floor(green * 1024), RGBEX_MIN, RGBEX_MAX); blue = C3.clamp(Math.floor(blue * 1024), RGBEX_MIN, RGBEX_MAX); alpha = C3.clamp(Math.floor(alpha * ALPHAEX_MAX), 0, ALPHAEX_MAX); if (red < 0) red += RGBEX_SHIFT; if (green < 0) green += RGBEX_SHIFT; if (blue < 0) blue += RGBEX_SHIFT; return -(red * RGBEX_SHIFT * RGBEX_SHIFT * ALPHAEX_SHIFT + green * RGBEX_SHIFT * ALPHAEX_SHIFT + blue * ALPHAEX_SHIFT + alpha) } ; C3.PackRGBEx = function PackRGBEx(red, green, blue) { return C3.PackRGBAEx(red, green, blue, 1) } ; function isNegativeZero(x) { return x === 0 && 1 / x < 0 } C3.GetRValue = function GetRValue(rgb) { if (rgb >= 0) return (rgb & 255) / 255; else { let v = Math.floor(-rgb / (RGBEX_SHIFT * RGBEX_SHIFT * ALPHAEX_SHIFT)); if (v > RGBEX_MAX) v -= RGBEX_SHIFT; return v / 1024 } } ; C3.GetGValue = function GetGValue(rgb) { if (rgb >= 0) return ((rgb & 65280) >> 8) / 255; else { let v = Math.floor(-rgb % (RGBEX_SHIFT * RGBEX_SHIFT * ALPHAEX_SHIFT) / (RGBEX_SHIFT * ALPHAEX_SHIFT)); if (v > RGBEX_MAX) v -= RGBEX_SHIFT; return v / 1024 } } ; C3.GetBValue = function GetBValue(rgb) { if (rgb >= 0) return ((rgb & 16711680) >> 16) / 255; else { let v = Math.floor(-rgb % (RGBEX_SHIFT * ALPHAEX_SHIFT) / ALPHAEX_SHIFT); if (v > RGBEX_MAX) v -= RGBEX_SHIFT; return v / 1024 } } ; C3.GetAValue = function GetAValue(rgb) { if (isNegativeZero(rgb)) return 0; else if (rgb >= 0) return 1; else { const v = Math.floor(-rgb % ALPHAEX_SHIFT); return v / ALPHAEX_MAX } } ; C3.greatestCommonDivisor = function greatestCommonDivisor(a, b) { a = Math.floor(a); b = Math.floor(b); while (b !== 0) { let t = b; b = a % b; a = t } return a } ; const COMMON_ASPECT_RATIOS = [[3, 2], [4, 3], [5, 4], [5, 3], [6, 5], [14, 9], [16, 9], [16, 10], [21, 9]]; C3.getAspectRatio = function getAspectRatio(w, h) { w = Math.floor(w); h = Math.floor(h); if (w === h) return [1, 1]; for (let aspect of COMMON_ASPECT_RATIOS) { let approxH = w / aspect[0] * aspect[1]; if (Math.abs(h - approxH) < 1) return aspect.slice(0); approxH = w / aspect[1] * aspect[0]; if (Math.abs(h - approxH) < 1) return [aspect[1], aspect[0]] } let gcd = C3.greatestCommonDivisor(w, h); return [w / gcd, h / gcd] } ; C3.segmentsIntersect = function segmentsIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { const min_ax = Math.min(a1x, a2x); const max_ax = Math.max(a1x, a2x); const min_bx = Math.min(b1x, b2x); const max_bx = Math.max(b1x, b2x); if (max_ax < min_bx || min_ax > max_bx) return false; const min_ay = Math.min(a1y, a2y); const max_ay = Math.max(a1y, a2y); const min_by = Math.min(b1y, b2y); const max_by = Math.max(b1y, b2y); if (max_ay < min_by || min_ay > max_by) return false; const dpx = b1x - a1x + b2x - a2x; const dpy = b1y - a1y + b2y - a2y; const qax = a2x - a1x; const qay = a2y - a1y; const qbx = b2x - b1x; const qby = b2y - b1y; const d = Math.abs(qay * qbx - qby * qax); const la = qbx * dpy - qby * dpx; if (Math.abs(la) > d) return false; const lb = qax * dpy - qay * dpx; return Math.abs(lb) <= d } ; C3.segmentsIntersectPreCalc = function segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, min_ax, max_ax, min_ay, max_ay, b1x, b1y, b2x, b2y) { const min_bx = Math.min(b1x, b2x); const max_bx = Math.max(b1x, b2x); if (max_ax < min_bx || min_ax > max_bx) return false; const min_by = Math.min(b1y, b2y); const max_by = Math.max(b1y, b2y); if (max_ay < min_by || min_ay > max_by) return false; const dpx = b1x - a1x + b2x - a2x; const dpy = b1y - a1y + b2y - a2y; const qax = a2x - a1x; const qay = a2y - a1y; const qbx = b2x - b1x; const qby = b2y - b1y; const d = Math.abs(qay * qbx - qby * qax); const la = qbx * dpy - qby * dpx; if (Math.abs(la) > d) return false; const lb = qax * dpy - qay * dpx; return Math.abs(lb) <= d } ; C3.segmentIntersectsQuad = function segmentIntersectsQuad(x1, y1, x2, y2, q) { const min_x = Math.min(x1, x2); const max_x = Math.max(x1, x2); const min_y = Math.min(y1, y2); const max_y = Math.max(y1, y2); const tlx = q.getTlx() , tly = q.getTly() , trx = q.getTrx() , try_ = q.getTry() , brx = q.getBrx() , bry = q.getBry() , blx = q.getBlx() , bly = q.getBly(); return C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, tlx, tly, trx, try_) || C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, trx, try_, brx, bry) || C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, brx, bry, blx, bly) || C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, blx, bly, tlx, tly) } ; C3.segmentIntersectsAnyN = function segmentIntersectsAnyN(x1, y1, x2, y2, points) { const min_x = Math.min(x1, x2); const max_x = Math.max(x1, x2); const min_y = Math.min(y1, y2); const max_y = Math.max(y1, y2); let i = 0; for (let last = points.length - 4; i <= last; i += 2) if (C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, points[i], points[i + 1], points[i + 2], points[i + 3])) return true; return C3.segmentsIntersectPreCalc(x1, y1, x2, y2, min_x, max_x, min_y, max_y, points[i], points[i + 1], points[0], points[1]) } ; const NO_HIT = 2; const PADDING = 1E-6; C3.rayIntersect = function rayIntersect(rx1, ry1, rx2, ry2, sx1, sy1, sx2, sy2) { const rdx = rx2 - rx1; const rdy = ry2 - ry1; const sdx = sx2 - sx1; const sdy = sy2 - sy1; const det = rdx * sdy - rdy * sdx; if (det === 0) return NO_HIT; const gamma = ((ry1 - ry2) * (sx2 - rx1) + rdx * (sy2 - ry1)) / det; if (0 < gamma && gamma < 1 + PADDING) return (sdy * (sx2 - rx1) + (sx1 - sx2) * (sy2 - ry1)) / det; return NO_HIT } ; C3.rayIntersectExtended = function rayIntersect(rx1, ry1, rx2, ry2, sx1, sy1, sx2, sy2, f) { const dx = (sx2 - sx1) * f; const dy = (sy2 - sy1) * f; return C3.rayIntersect(rx1, ry1, rx2, ry2, sx1 - dx, sy1 - dy, sx2 + dx, sy2 + dy) } ; C3.isPointInTriangleInclusive = function isPointInTriangleInclusive(px, py, tx1, ty1, tx2, ty2, tx3, ty3) { const v0x = tx2 - tx1; const v0y = ty2 - ty1; const v1x = tx3 - tx1; const v1y = ty3 - ty1; const v2x = px - tx1; const v2y = py - ty1; const dot00 = v0x * v0x + v0y * v0y; const dot01 = v0x * v1x + v0y * v1y; const dot02 = v0x * v2x + v0y * v2y; const dot11 = v1x * v1x + v1y * v1y; const dot12 = v1x * v2x + v1y * v2y; const invDenom = 1 / (dot00 * dot11 - dot01 * dot01); const u = (dot11 * dot02 - dot01 * dot12) * invDenom; const v = (dot00 * dot12 - dot01 * dot02) * invDenom; return u >= 0 && v >= 0 && u + v <= 1 } ; C3.triangleCartesianToBarycentric = function triangleCartesianToBarycentric(px, py, tx1, ty1, tx2, ty2, tx3, ty3) { const v0x = tx2 - tx1; const v0y = ty2 - ty1; const v1x = tx3 - tx1; const v1y = ty3 - ty1; const v2x = px - tx1; const v2y = py - ty1; const dot00 = v0x * v0x + v0y * v0y; const dot01 = v0x * v1x + v0y * v1y; const dot11 = v1x * v1x + v1y * v1y; const dot20 = v2x * v0x + v2y * v0y; const dot21 = v2x * v1x + v2y * v1y; const denom = dot00 * dot11 - dot01 * dot01; const v = (dot11 * dot20 - dot01 * dot21) / denom; const w = (dot00 * dot21 - dot01 * dot20) / denom; const u = 1 - v - w; return [u, v, w] } ; C3.triangleBarycentricToCartesian = function triangleBarycentricToCartesian(u, v, w, tx1, ty1, tx2, ty2, tx3, ty3) { return [u * tx1 + v * tx2 + w * tx3, u * ty1 + v * ty2 + w * ty3] } } ;'use strict'; { const C3 = self.C3; let mainDocument = null; let baseHref = ""; if (typeof document !== "undefined") { mainDocument = document; const baseElem = document.querySelector("base"); baseHref = baseElem && baseElem.hasAttribute("href") ? baseElem.getAttribute("href") : ""; if (baseHref) { if (baseHref.startsWith("/")) baseHref = baseHref.substr(1); if (!baseHref.endsWith("/")) baseHref += "/" } } C3.GetBaseHref = function GetBaseHref() { return baseHref } ; C3.GetBaseURL = function GetBaseURL() { if (!mainDocument) return ""; const loc = mainDocument.location; return C3.GetPathFromURL(loc.origin + loc.pathname) + baseHref } ; C3.GetPathFromURL = function GetPathFromURL(url) { if (!url.length) return url; if (url.endsWith("/") || url.endsWith("\\")) return url; const lastSlash = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\")); if (lastSlash === -1) return ""; return url.substr(0, lastSlash + 1) } ; C3.GetFilenameFromURL = function GetFilenameFromURL(url) { if (!url.length) return url; if (url.endsWith("/") || url.endsWith("\\")) return ""; const lastSlash = Math.max(url.lastIndexOf("/"), url.lastIndexOf("\\")); if (lastSlash === -1) return url; return url.substr(lastSlash + 1) } ; C3.DataTransferHasFiles = function DataTransferHasFiles(dataTransfer) { if (dataTransfer.types) for (let i = 0; i < dataTransfer.types.length; i++) if (dataTransfer.types[i] === "Files" || dataTransfer.types[i] === "application/x-c3-file") return true; return false } ; C3.DataTransferFilterFiles = async function DataTransferHasFiles(dataTransfer, filter) { const ret = Array.from(dataTransfer.files).filter(file=>{ return file.size !== 0 } ).filter(file=>{ return filter(file) } ).map(async file=>{ try { return await C3.CloneFile(file) } catch (err) { return null } } ); const files = await Promise.all(ret); return files.filter(file=>file) } ; C3.IsFileAnImage = function IsFileAnImage(file) { if (file.type) return file.type.search(/image\/.*/) !== -1; else { const type = C3.MimeType.GetForFileExtension(C3.GetFileExtension(file.name)).GetString(); return type.search(/image\/.*/) !== -1 } } ; C3.IsFileAnSVG = function IsFileAnSVG(file) { return file.type === "image/svg+xml" } ; C3.IsFileAMultiImageContainer = function IsFileAMultiImageContainer(file) { if (file.type) return C3.MimeType.Get(file.type).IsAnimatedImage(); else return C3.MimeType.GetForFileExtension(C3.GetFileExtension(file.name)).IsAnimatedImage() } ; C3.GetFileExtension = function GetFileExtension(filename) { let i = filename.lastIndexOf("."); if (i < 1) return ""; else return filename.substr(i) } ; C3.GetFileNamePart = function GetFileNamePart(filename) { let i = filename.lastIndexOf("."); if (i < 1) return filename; else return filename.substr(0, i) } ; C3.NormalizeFileSeparator = function NormalizeFileSeparator(path) { return path.replace(/\\/g, "/") } ; C3.ParseFilePath = function ParseFilePath(path) { path = C3.NormalizeFileSeparator(path); let root = /^\w:\//.exec(path); if (root) { root = root[0]; path = path.slice(3); if (path[0] !== "/") path = "/" + path } else root = ""; path = path.replace(/\/{2,}/g, "/"); if (path.length > 1 && path.slice(-1) === "/") path = path.slice(0, -1); const start = path.lastIndexOf("/") + 1; let dir = "", base = path, name, ext = ""; if (start > 0) { dir = path.slice(0, start); base = path.slice(start) } name = base; const end = base.lastIndexOf("."); if (end > 0) { ext = base.slice(end); name = base.slice(0, -ext.length) } const full = root + dir + base; return { dir, base, name, root, ext, full } } ; C3.Wait = function Wait(delay, argument) { return new Promise((resolve,reject)=>{ self.setTimeout(resolve, delay, argument) } ) } ; C3.swallowException = function swallowException(f) { try { f() } catch (e) { if (C3.isDebug) console.warn("Swallowed exception: ", e) } } ; C3.noop = function noop() {} ; C3.equalsNoCase = function equalsNoCase(a, b) { if (typeof a !== "string" || typeof b !== "string") return false; if (a === b) return true; a = a.normalize(); b = b.normalize(); if (a.length !== b.length) return false; return a.toLowerCase() === b.toLowerCase() } ; C3.equalsCase = function equalsCase(a, b) { if (typeof a !== "string" || typeof b !== "string") return false; if (a === b) return true; return a.normalize() === b.normalize() } ; C3.typedArraySet16 = function typedArraySet16(dest, src, i) { dest[i++] = src[0]; dest[i++] = src[1]; dest[i++] = src[2]; dest[i++] = src[3]; dest[i++] = src[4]; dest[i++] = src[5]; dest[i++] = src[6]; dest[i++] = src[7]; dest[i++] = src[8]; dest[i++] = src[9]; dest[i++] = src[10]; dest[i++] = src[11]; dest[i++] = src[12]; dest[i++] = src[13]; dest[i++] = src[14]; dest[i] = src[15] } ; C3.truncateArray = function truncateArray(arr, index) { arr.length = index } ; C3.clearArray = function clearArray(arr) { if (!arr) return; if (arr.length === 0) return; C3.truncateArray(arr, 0) } ; C3.clear2DArray = function clear2DArray(arr) { if (!arr) return; for (let i = 0; i < arr.length; i++) { let a = arr[i]; C3.truncateArray(a, 0) } C3.truncateArray(arr, 0) } ; C3.extendArray = function extendArray(arr, len, filler) { len = len | 0; const arrayLength = arr.length; if (len <= arrayLength) return; for (let i = arrayLength; i < len; ++i) arr.push(filler) } ; C3.resizeArray = function resizeArray(arr, len, filler) { len = len | 0; const arrayLength = arr.length; if (len < arrayLength) C3.truncateArray(arr, len); else if (len > arrayLength) C3.extendArray(arr, len, filler) } ; C3.shallowAssignArray = function shallowAssignArray(dest, src) { C3.clearArray(dest); C3.appendArray(dest, src) } ; C3.appendArray = function appendArray(a, b) { if (b.length < 1E4) a.push(...b); else for (let i = 0, len = b.length; i < len; ++i) a.push(b[i]) } ; C3.arrayRemove = function(arr, index) { index = Math.floor(index); if (index < 0 || index >= arr.length) return; let len = arr.length - 1; for (let i = index; i < len; ++i) arr[i] = arr[i + 1]; C3.truncateArray(arr, len) } ; C3.arrayFindRemove = function arrayFindRemove(a, o) { let i = a.indexOf(o); if (i >= 0) a.splice(i, 1) } ; C3.arraysEqual = function arraysEqual(a, b) { let len = a.length; if (b.length !== len) return false; for (let i = 0; i < len; ++i) if (a[i] !== b[i]) return false; return true } ; C3.arrayFilterOut = function arrayFilterOut(arr, callback) { let ret = []; let j = 0; for (let i = 0, len = arr.length; i < len; ++i) { let item = arr[i]; if (callback(item)) ret.push(item); else { arr[j] = item; ++j } } C3.truncateArray(arr, j); return ret } ; C3.arrayRemoveAllInSet = function arrayRemoveAllInSet(arr, s) { const oldLen = arr.length; let j = 0; for (let i = 0, len = arr.length; i < len; ++i) { let item = arr[i]; if (!s.has(item)) arr[j++] = item } C3.truncateArray(arr, j); return oldLen - j } ; C3.isArrayIndexInBounds = function isArrayIndexInBounds(index, array) { if (index !== Math.floor(index)) return false; return index >= 0 && index < array.length } ; C3.validateArrayIndex = function validateArrayIndex(index, array) { if (!C3.isArrayIndexInBounds(index, array)) throw new RangeError("array index out of bounds"); } ; C3.cloneArray = function cloneArray(array) { return array.slice() } ; C3.deepCloneArray = function deepCloneArray(array, f) { let ret = []; for (let e of array) if (C3.IsObject(e)) { let clone = f(e); if (!clone) throw new Error("missing clone"); if (clone.constructor !== e.constructor) throw new Error("object is not a clone"); ret.push(clone) } else if (C3.IsArray(e)) ret.push(C3.deepCloneArray(e, f)); else ret.push(e); return ret } ; C3.clone2DArray = function cloneArray(array) { let ret = []; for (let arr of array) ret.push(arr.slice()); return ret } ; C3.mergeSets = function mergeSets(set1, set2) { return new Set([...set1, ...set2]) } ; C3.mergeSetsInPlace = function mergeSetsInPlace(set1, set2) { for (const item of set2) set1.add(item); return set1 } ; C3.first = function first(iterable) { for (let i of iterable) return i; return null } ; C3.xor = function(x, y) { return !x !== !y } ; C3.compare = function compare(x, cmp, y) { switch (cmp) { case 0: return x === y; case 1: return x !== y; case 2: return x < y; case 3: return x <= y; case 4: return x > y; case 5: return x >= y; default: return false } } ; C3.hasAnyOwnProperty = function hasAnyOwnProperty(o) { for (let p in o) if (o.hasOwnProperty(p)) return true; return false } ; C3.PromiseAllWithProgress = function PromiseAllWithProgress(arr, progressCallback) { if (!arr.length) return Promise.resolve([]); return new Promise((resolve,reject)=>{ const results = []; let numberCompleted = 0; let cancelled = false; for (let i = 0, len = arr.length; i < len; ++i) { results.push(void 0); arr[i].then(result=>{ if (cancelled) return; results[i] = result; ++numberCompleted; if (numberCompleted === arr.length) resolve(results); else progressCallback(numberCompleted, arr.length) } ).catch(err=>{ cancelled = true; reject(err) } ) } } ) } ; let memoryCallbacks = []; C3.AddLibraryMemoryCallback = function AddLibraryMemoryCallback(f) { memoryCallbacks.push(f) } ; C3.GetEstimatedLibraryMemoryUsage = function GetEstimatedLibraryMemoryUsage() { let ret = 0; for (let f of memoryCallbacks) { let m = f(); ret += m } return Math.floor(ret) } ; let nextTaskId = 1; const activeTaskIds = new Map; const taskMessageChannel = new MessageChannel; taskMessageChannel.port2.onmessage = function OnTask(e) { const id = e.data; const callback = activeTaskIds.get(id); activeTaskIds.delete(id); if (callback) callback(e.timeStamp) } ; C3.RequestUnlimitedAnimationFrame = function RequestUnlimitedAnimationFrame(callback) { const id = nextTaskId++; activeTaskIds.set(id, callback); taskMessageChannel.port1.postMessage(id); return id } ; C3.CancelUnlimitedAnimationFrame = function CancelUnlimitedAnimationFrame(id) { activeTaskIds.delete(id) } ; C3.PostTask = C3.RequestUnlimitedAnimationFrame; C3.WaitForNextTask = function WaitForNextTask() { return new Promise(resolve=>C3.PostTask(resolve)) } ; const activeRPAFids = new Set; C3.RequestPostAnimationFrame = function RequestPostAnimationFrame(callback) { const id = self.requestAnimationFrame(async timestamp=>{ await C3.WaitForNextTask(); if (!activeRPAFids.has(id)) return; activeRPAFids.delete(id); callback(timestamp) } ); activeRPAFids.add(id); return id } ; C3.CancelPostAnimationFrame = function CancelPostAnimationFrame(id) { if (!activeRPAFids.has(id)) return; self.cancelAnimationFrame(id); activeRPAFids.delete(id) } } ;'use strict'; { const C3 = self.C3; C3.IsAbsoluteURL = function IsAbsoluteURL(url) { return /^(?:[a-z]+:)?\/\//.test(url) || url.substr(0, 5) === "data:" || url.substr(0, 5) === "blob:" } ; C3.IsRelativeURL = function IsRelativeURL(url) { return !C3.IsAbsoluteURL(url) } ; C3.ThrowIfNotOk = function ThrowIfNotOk(response) { if (!response.ok) throw new Error(`fetch '${response.url}' response returned ${response.status} ${response.statusText}`); } ; C3.FetchOk = function FetchOk(url, init) { return fetch(url, init).then(response=>{ C3.ThrowIfNotOk(response); return response } ) } ; C3.FetchText = function FetchText(url) { return C3.FetchOk(url).then(response=>response.text()) } ; C3.FetchJson = function FetchJson(url) { return C3.FetchOk(url).then(response=>response.json()) } ; C3.FetchBlob = function FetchBlob(url) { return C3.FetchOk(url).then(response=>response.blob()) } ; C3.FetchArrayBuffer = function FetchArrayBuffer(url) { return C3.FetchOk(url).then(response=>response.arrayBuffer()) } ; C3.FetchImage = function FetchImage(url) { return new Promise((resolve,reject)=>{ const img = new Image; img.onload = ()=>resolve(img); img.onerror = err=>reject(err); img.src = url } ) } ; C3.BlobToArrayBuffer = function BlobToArrayBuffer(blob) { if (typeof blob["arrayBuffer"] === "function") return blob["arrayBuffer"](); else return new Promise((resolve,reject)=>{ const fileReader = new FileReader; fileReader.onload = ()=>resolve(fileReader.result); fileReader.onerror = ()=>reject(fileReader.error); fileReader.readAsArrayBuffer(blob) } ) } ; C3.BlobToString = function BlobToString(blob) { if (typeof blob["text"] === "function") return blob["text"](); else return new Promise((resolve,reject)=>{ const fileReader = new FileReader; fileReader.onload = ()=>resolve(fileReader.result); fileReader.onerror = ()=>reject(fileReader.error); fileReader.readAsText(blob) } ) } ; C3.BlobToJson = function BlobToJson(blob) { return C3.BlobToString(blob).then(text=>JSON.parse(text)) } ; C3.BlobToImage = async function BlobToImage(blob, decodeImage) { let blobUrl = URL.createObjectURL(blob); try { const img = await C3.FetchImage(blobUrl); URL.revokeObjectURL(blobUrl); blobUrl = ""; if (decodeImage && typeof img["decode"] === "function") await img["decode"](); return img } finally { if (blobUrl) URL.revokeObjectURL(blobUrl) } } ; C3.CreateCanvas = function CreateCanvas(width, height) { if (typeof document !== "undefined" && typeof document.createElement === "function") { const canvas = document.createElement("canvas"); canvas.width = width; canvas.height = height; return canvas } else return new OffscreenCanvas(width,height) } ; C3.CanvasToBlob = function CanvasToBlob(canvas, type, quality) { if (typeof quality !== "number") quality = 1; type = type || "image/png"; quality = C3.clamp(quality, 0, 1); if (canvas.toBlob) return new Promise(resolve=>canvas.toBlob(resolve, type, quality)); else if (canvas["convertToBlob"]) return canvas["convertToBlob"]({ "type": type, "quality": quality }); else return C3.Asyncify(()=>C3.CanvasToBlobSync(canvas, type, quality)) } ; C3.CanvasToBlobSync = function CanvasToBlobSync(canvas, type, quality) { if (typeof quality !== "number") quality = 1; type = type || "image/png"; quality = C3.clamp(quality, 0, 1); return C3.DataURIToBinaryBlobSync(canvas.toDataURL(type, quality)) } ; C3.DataURIToBinaryBlobSync = function DataURIToBinaryBlobSync(datauri) { const o = C3.ParseDataURI(datauri); return C3.BinaryStringToBlob(o.data, o.mime_type) } ; C3.ParseDataURI = function ParseDataURI(datauri) { if (datauri.substr(0, 5) !== "data:") throw new URIError("expected data: uri"); let comma = datauri.indexOf(","); if (comma < 0) throw new URIError("expected comma in data: uri"); let typepart = datauri.substring(5, comma); let datapart = datauri.substring(comma + 1); let typearr = typepart.split(";"); let mimetype = typearr[0] || ""; let encoding1 = typearr[1]; let encoding2 = typearr[2]; let decodeddata; if (encoding1 === "base64" || encoding2 === "base64") decodeddata = atob(datapart); else decodeddata = decodeURIComponent(datapart); return { mime_type: mimetype, data: decodeddata } } ; C3.BinaryStringToBlob = function BinaryStringToBlob(binstr, mime_type) { let len = binstr.length; let len32 = len >> 2; let a8 = new Uint8Array(len); let a32 = new Uint32Array(a8.buffer,0,len32); let i, j; for (i = 0, j = 0; i < len32; ++i) a32[i] = binstr.charCodeAt(j++) | binstr.charCodeAt(j++) << 8 | binstr.charCodeAt(j++) << 16 | binstr.charCodeAt(j++) << 24; let tailLength = len & 3; while (tailLength--) { a8[j] = binstr.charCodeAt(j); ++j } if (mime_type) return new Blob([a8],{ "type": mime_type }); else return new Blob([a8]) } ; C3.DrawableToBlob = function DrawableToBlob(drawable, type, quality) { const canvas = C3.CreateCanvas(drawable.width, drawable.height); const ctx = canvas.getContext("2d"); ctx.drawImage(drawable, 0, 0); return C3.CanvasToBlob(canvas, type, quality) } ; C3.ImageDataToBlobSync = function ImageDataToBlobSync(imageData, type, quality) { const canvas = C3.CreateCanvas(imageData.width, imageData.height); const ctx = canvas.getContext("2d"); ctx.putImageData(imageData, 0, 0); return C3.CanvasToBlobSync(canvas, type, quality) } ; C3.ImageDataToBlob = function ImageDataToBlob(imageData, type, quality) { if (C3.Supports.ImageBitmapOptions) return createImageBitmap(imageData, { "premultiplyAlpha": "none" }).then(imageBitmap=>C3.DrawableToBlob(imageBitmap, type, quality)); else if (C3.Supports.ImageBitmap) return createImageBitmap(imageData).then(imageBitmap=>C3.DrawableToBlob(imageBitmap, type, quality)); else { const canvas = C3.CreateCanvas(imageData.width, imageData.height); const ctx = canvas.getContext("2d"); ctx.putImageData(imageData, 0, 0); return C3.CanvasToBlob(canvas, type, quality) } } ; C3.CopySet = function CopySet(dest, src) { dest.clear(); for (const x of src) dest.add(x) } ; C3.MapToObject = function MapToObject(map) { const ret = Object.create(null); for (const [k,v] of map.entries()) ret[k] = v; return ret } ; C3.ObjectToMap = function ObjectToMap(o, map) { map.clear(); for (const [k,v] of Object.entries(o)) map.set(k, v) } ; C3.ToSuperJSON = function ToSuperJSON(v) { if (typeof v === "object" && v !== null) if (v instanceof Set) return { "_c3type_": "set", "data": [...v].map(o=>ToSuperJSON(o)) }; else if (v instanceof Map) return { "_c3type_": "map", "data": [...v].map(pair=>[pair[0], ToSuperJSON(pair[1])]) }; else { const ret = Object.create(null); for (const [key,value] of Object.entries(v)) ret[key] = ToSuperJSON(value); return ret } return v } ; C3.FromSuperJSON = function FromSuperJSON(v) { if (typeof v === "object" & v !== null) if (v["_c3type_"] === "set") return new Set(v["data"].map(o=>FromSuperJSON(o))); else if (v["_c3type_"] === "map") return new Map(v["data"].map(pair=>[pair[0], FromSuperJSON(pair[1])])); else { const ret = Object.create(null); for (const [key,value] of Object.entries(v)) ret[key] = FromSuperJSON(value); return ret } return v } ; C3.CSSToCamelCase = function(str) { let ret = ""; let isAfterHyphen = false; for (const ch of str) if (ch === "-") isAfterHyphen = true; else if (isAfterHyphen) { ret += ch.toUpperCase(); isAfterHyphen = false } else ret += ch; return ret } ; C3.IsIterator = function(o) { return typeof o === "object" && typeof o.next === "function" } ; C3.MakeFilledArray = function MakeFilledArray(len, data) { const ret = []; if (typeof data === "function") for (let i = 0; i < len; ++i) ret.push(data()); else for (let i = 0; i < len; ++i) ret.push(data); return ret } } ;'use strict'; { const C3 = self.C3; const HSL_TEST = /([0-9.]+),([0-9.]+)%?,([0-9.]+)%?/i; const HSLA_TEST = /([0-9.]+),([0-9.]+)%?,([0-9.]+)%?,([0-9.])/i; function padTwoDigits(str) { if (str.length === 0) return "00"; else if (str.length === 1) return "0" + str; else return str } function hueToRGB(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p } C3.Color = class Color { constructor(r, g, b, a) { this._r = NaN; this._g = NaN; this._b = NaN; this._a = NaN; this._r = 0; this._g = 0; this._b = 0; this._a = 0; if (r instanceof C3.Color) this.set(r); else this.setRgba(r || 0, g || 0, b || 0, a || 0) } setRgb(r, g, b) { this._r = +r; this._g = +g; this._b = +b; this.clamp(); return this } setRgba(r, g, b, a) { this._r = +r; this._g = +g; this._b = +b; this._a = +a; this.clamp(); return this } set(c) { this._r = c._r; this._g = c._g; this._b = c._b; this._a = c._a; return this } copy(c) { return this.set(c) } add(c) { this._r += c._r; this._g += c._g; this._b += c._b; this._a += c._a; this.clamp() } addRgb(r, g, b, a=0) { this._r += +r; this._g += +g; this._b += +b; this._a += +a; this.clamp() } diff(c) { this.setR(Math.max(this._r, c._r) - Math.min(this._r, c._r)); this.setG(Math.max(this._g, c._g) - Math.min(this._g, c._g)); this.setB(Math.max(this._b, c._b) - Math.min(this._b, c._b)); this.setA(Math.max(this._a, c._a) - Math.min(this._a, c._a)); this.clamp() } copyRgb(c) { this._r = c._r; this._g = c._g; this._b = c._b } setR(r) { this._r = C3.clamp(+r, 0, 1) } getR() { return this._r } setG(g) { this._g = C3.clamp(+g, 0, 1) } getG() { return this._g } setB(b) { this._b = C3.clamp(+b, 0, 1) } getB() { return this._b } setA(a) { this._a = C3.clamp(+a, 0, 1) } getA() { return this._a } clone() { return C3.New(C3.Color, this._r, this._g, this._b, this._a) } toArray() { return [this._r, this._g, this._b, this._a] } toTypedArray() { return new Float64Array(this.toArray()) } writeToTypedArray(ta, i) { ta[i++] = this._r; ta[i++] = this._g; ta[i++] = this._b; ta[i] = this._a } equals(c) { return this._r === c._r && this._g === c._g && this._b === c._b && this._a === c._a } equalsIgnoringAlpha(c) { return this._r === c._r && this._g === c._g && this._b === c._b } equalsRgb(r, g, b) { return this._r === r && this._g === g && this._b === b } equalsRgba(r, g, b, a) { return this._r === r && this._g === g && this._b === b && this._a === a } multiply(c) { this._r *= c._r; this._g *= c._g; this._b *= c._b; this._a *= c._a } multiplyAlpha(a) { this._r *= a; this._g *= a; this._b *= a; this._a *= a } premultiply() { this._r *= this._a; this._g *= this._a; this._b *= this._a; return this } unpremultiply() { this._r /= this._a; this._g /= this._a; this._b /= this._a; return this } clamp() { this._r = C3.clamp(this._r, 0, 1); this._g = C3.clamp(this._g, 0, 1); this._b = C3.clamp(this._b, 0, 1); this._a = C3.clamp(this._a, 0, 1); return this } setFromRgbValue(rgb) { this._r = C3.GetRValue(rgb); this._g = C3.GetGValue(rgb); this._b = C3.GetBValue(rgb); this._a = C3.GetAValue(rgb) } getCssRgb(_r, _g, _b) { const r = C3.IsFiniteNumber(_r) ? _r : this.getR(); const g = C3.IsFiniteNumber(_g) ? _g : this.getG(); const b = C3.IsFiniteNumber(_b) ? _b : this.getB(); return `rgb(${r * 100}%, ${g * 100}%, ${b * 100}%)` } getCssRgba(_r, _g, _b, _a) { const r = C3.IsFiniteNumber(_r) ? _r : this.getR(); const g = C3.IsFiniteNumber(_g) ? _g : this.getG(); const b = C3.IsFiniteNumber(_b) ? _b : this.getB(); const a = C3.IsFiniteNumber(_a) ? _a : this.getA(); return `rgba(${r * 100}%, ${g * 100}%, ${b * 100}%, ${a})` } toHexString() { const rh = Math.round(this.getR() * 255); const gh = Math.round(this.getG() * 255); const bh = Math.round(this.getB() * 255); return "#" + padTwoDigits(rh.toString(16)) + padTwoDigits(gh.toString(16)) + padTwoDigits(bh.toString(16)) } parseHexString(str) { if (typeof str !== "string") return false; str = str.trim(); if (str.charAt(0) === "#") str = str.substr(1); let rv; let gv; let bv; if (str.length === 3) { rv = parseInt(str[0], 16) / 15; gv = parseInt(str[1], 16) / 15; bv = parseInt(str[2], 16) / 15 } else if (str.length === 6) { rv = parseInt(str.substr(0, 2), 16) / 255; gv = parseInt(str.substr(2, 2), 16) / 255; bv = parseInt(str.substr(4, 2), 16) / 255 } else return false; if (isFinite(rv)) this.setR(rv); if (isFinite(gv)) this.setG(gv); if (isFinite(bv)) this.setB(bv); this.setA(1); return true } toCommaSeparatedRgb() { const rv = Math.round(this.getR() * 255); const gv = Math.round(this.getG() * 255); const bv = Math.round(this.getB() * 255); return `${rv}, ${gv}, ${bv}` } toRgbArray() { const rv = Math.round(this.getR() * 255); const gv = Math.round(this.getG() * 255); const bv = Math.round(this.getB() * 255); return [rv, gv, bv] } parseCommaSeparatedRgb(str) { if (typeof str !== "string") return false; str = str.replace(/^rgb\(|\)|%/, ""); const arr = str.split(","); if (arr.length < 3) return false; const rv = parseInt(arr[0].trim(), 10) / 255; const gv = parseInt(arr[1].trim(), 10) / 255; const bv = parseInt(arr[2].trim(), 10) / 255; if (isFinite(rv)) this.setR(rv); if (isFinite(gv)) this.setG(gv); if (isFinite(bv)) this.setB(bv); this.setA(1); return true } parseCommaSeparatedPercentageRgb(str) { if (typeof str !== "string") return false; str = str.replace(/^rgb\(|\)|%/, ""); const arr = str.split(","); if (arr.length < 3) return false; const rv = parseInt(arr[0].trim(), 10) / 100; const gv = parseInt(arr[1].trim(), 10) / 100; const bv = parseInt(arr[2].trim(), 10) / 100; if (isFinite(rv)) this.setR(rv); if (isFinite(gv)) this.setG(gv); if (isFinite(bv)) this.setB(bv); this.setA(1); return true } parseCommaSeparatedRgba(str) { if (typeof str !== "string") return false; str = str.replace(/^rgba\(|\)|%/, ""); const arr = str.split(","); if (arr.length < 4) return false; const rv = parseInt(arr[0].trim(), 10) / 255; const gv = parseInt(arr[1].trim(), 10) / 255; const bv = parseInt(arr[2].trim(), 10) / 255; const av = parseFloat(arr[3].trim()); if (isFinite(rv)) this.setR(rv); if (isFinite(gv)) this.setG(gv); if (isFinite(bv)) this.setB(bv); if (isFinite(av)) this.setA(av); return true } parseCommaSeparatedPercentageRgba(str) { if (typeof str !== "string") return false; str = str.replace(/^rgba\(|\)|%/, ""); const arr = str.split(","); if (arr.length < 4) return false; const rv = parseInt(arr[0].trim(), 10) / 100; const gv = parseInt(arr[1].trim(), 10) / 100; const bv = parseInt(arr[2].trim(), 10) / 100; const av = parseFloat(arr[3].trim()); if (isFinite(rv)) this.setR(rv); if (isFinite(gv)) this.setG(gv); if (isFinite(bv)) this.setB(bv); if (isFinite(av)) this.setA(av); return true } parseString(str) { if (typeof str !== "string") return false; str = str.replace(/\s+/, ""); if (str.includes(",")) if (str.startsWith("rgb(")) if (str.includes("%")) return this.parseCommaSeparatedPercentageRgb(str); else return this.parseCommaSeparatedRgb(str); else if (str.startsWith("rgba(")) if (str.includes("%")) return this.parseCommaSeparatedPercentageRgba(str); else return this.parseCommaSeparatedRgba(str); else if (str.startsWith("hsl(") || str.startsWith("hsla(")) return this.parseHSLString(str); else { const components = str.split(","); if (str.includes("%")) { if (components.length === 3) return this.parseCommaSeparatedPercentageRgb(str); else if (components.length === 4) return this.parseCommaSeparatedPercentageRgba(str); return false } else { if (components.length === 3) return this.parseCommaSeparatedRgb(str); else if (components.length === 4) return this.parseCommaSeparatedRgba(str); return false } } else return this.parseHexString(str) } toJSON() { return [this._r, this._g, this._b, this._a] } setFromHSLA(h, s, l, a) { let r; let g; let b; h %= 360; s = C3.clamp(s, 0, 100); l = C3.clamp(l, 0, 100); a = C3.clamp(a, 0, 1); h /= 360; s /= 100; l /= 100; if (s === 0) r = g = b = l; else { const q = l < .5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; r = hueToRGB(p, q, h + 1 / 3); g = hueToRGB(p, q, h); b = hueToRGB(p, q, h - 1 / 3) } this.setR(r); this.setG(g); this.setB(b); this.setA(a); return this } parseHSLString(str) { const cleanString = str.replace(/ |hsl|hsla|\(|\)|;/gi, ""); const hsl = HSL_TEST.exec(cleanString); const hsla = HSLA_TEST.exec(cleanString); if (hsl && hsl.length === 4) { this.setFromHSLA(+hsl[1], +hsl[2], +hsl[3], 1); return true } else if (hsla && hsla.length === 5) { this.setFromHSLA(+hsl[1], +hsl[2], +hsl[3], +hsl[4]); return true } return false } toHSLAString() { const r = this._r; const g = this._g; const b = this._b; const a = this._a; const h = C3.Color.GetHue(r, g, b); const s = C3.Color.GetSaturation(r, g, b); const l = C3.Color.GetLuminosity(r, g, b); return `hsla(${h}, ${s}%, ${l}%, ${a})` } toHSLAArray() { const r = this._r; const g = this._g; const b = this._b; return [C3.Color.GetHue(r, g, b), C3.Color.GetSaturation(r, g, b), C3.Color.GetLuminosity(r, g, b), this._a] } setFromJSON(arr) { if (!Array.isArray(arr)) return; if (arr.length < 3) return; this._r = arr[0]; this._g = arr[1]; this._b = arr[2]; if (arr.length >= 4) this._a = arr[3]; else this._a = 1 } set r(r) { this.setR(r) } get r() { return this.getR() } set g(g) { this.setG(g) } get g() { return this.getG() } set b(b) { this.setB(b) } get b() { return this.getB() } set a(a) { this.setA(a) } get a() { return this.getA() } setAtIndex(i, v) { switch (i) { case 0: this.setR(v); break; case 1: this.setG(v); break; case 2: this.setB(v); break; case 3: this.setA(v); break; default: throw new RangeError("invalid color index"); } } getAtIndex(i) { switch (i) { case 0: return this.getR(); case 1: return this.getG(); case 2: return this.getB(); case 3: return this.getA(); default: throw new RangeError("invalid color index"); } } static DiffChannel(channel1, channel2) { return C3.clamp(Math.max(channel1, channel2) - Math.min(channel1, channel2), 0, 1) } static Diff(c1, c2) { const ret = new C3.Color; ret.setR(Math.max(c1._r, c2._r) - Math.min(c1._r, c2._r)); ret.setG(Math.max(c1._g, c2._g) - Math.min(c1._g, c2._g)); ret.setB(Math.max(c1._b, c2._b) - Math.min(c1._b, c2._b)); ret.setA(Math.max(c1._a, c2._a) - Math.min(c1._a, c2._a)); return ret } static DiffNoAlpha(c1, c2) { const ret = new C3.Color(0,0,0,1); ret.setR(Math.max(c1._r, c2._r) - Math.min(c1._r, c2._r)); ret.setG(Math.max(c1._g, c2._g) - Math.min(c1._g, c2._g)); ret.setB(Math.max(c1._b, c2._b) - Math.min(c1._b, c2._b)); return ret } static GetHue(r, g, b) { const max = Math.max(r, g, b); const min = Math.min(r, g, b); if (max === min) return 0; let h = 0; switch (max) { case r: h = (g - b) / (max - min) + (g < b ? 6 : 0); break; case g: h = (b - r) / (max - min) + 2; break; case b: h = (r - g) / (max - min) + 4; break } return Math.round(h / 6 * 360) } static GetSaturation(r, g, b) { const max = Math.max(r, g, b); const min = Math.min(r, g, b); if (max === min) return 0; const l = (max + min) / 2; const d = max - min; const s = l > .5 ? d / (2 - max - min) : d / (max + min); return Math.round(s * 100) } static GetLuminosity(r, g, b) { const max = Math.max(r, g, b); const min = Math.min(r, g, b); const l = (max + min) / 2; if (!max) return 0; return Math.round(l * 100) } } ; C3.Color.White = Object.freeze(C3.New(C3.Color, 1, 1, 1, 1)); C3.Color.Black = Object.freeze(C3.New(C3.Color, 0, 0, 0, 1)); C3.Color.TransparentBlack = Object.freeze(C3.New(C3.Color, 0, 0, 0, 0)) } ;'use strict'; { const C3 = self.C3; C3.Vector2 = class Vector2 { constructor(x, y) { this._x = 0; this._y = 0; if (x instanceof C3.Vector2) this.copy(x); else this.set(x || 0, y || 0) } set(x, y) { this._x = +x; this._y = +y } copy(v) { this._x = v._x; this._y = v._y } equals(v) { return this._x === v._x && this._y === v._y } setX(x) { this._x = +x } getX() { return this._x } setY(y) { this._y = +y } getY() { return this._y } toArray() { return [this._x, this._y] } toTypedArray() { return new Float64Array(this.toArray()) } writeToTypedArray(ta, i) { ta[i++] = this._x; ta[i] = this._y } offset(x, y) { this._x += +x; this._y += +y } scale(x, y) { this._x *= x; this._y *= y } round() { this._x = Math.round(this._x); this._y = Math.round(this._y) } floor() { this._x = Math.floor(this._x); this._y = Math.floor(this._y) } ceil() { this._x = Math.ceil(this._x); this._y = Math.ceil(this._y) } angle() { return C3.angleTo(0, 0, this._x, this._y) } lengthSquared() { return this._x * this._x + this._y * this._y } length() { return Math.sqrt(this.lengthSquared()) } rotatePrecalc(sin_a, cos_a) { const temp = this._x * cos_a - this._y * sin_a; this._y = this._y * cos_a + this._x * sin_a; this._x = temp } rotate(a) { if (a === 0) return; this.rotatePrecalc(Math.sin(a), Math.cos(a)) } rotateAbout(a, x, y) { if (a === 0 || x === this._x && y === this._y) return; this._x -= x; this._y -= y; this.rotatePrecalc(Math.sin(a), Math.cos(a)); this._x += +x; this._y += +y } move(a, dist) { if (dist === 0) return; this._x += Math.cos(a) * dist; this._y += Math.sin(a) * dist } normalize() { const m = this.length(); if (m !== 0 && m !== 1) { this._x /= m; this._y /= m } } clamp(lower, upper) { this._x = C3.clamp(this._x, lower, upper); this._y = C3.clamp(this._y, lower, upper) } } } ;'use strict'; { const C3 = self.C3; C3.Rect = class Rect { constructor(left, top, right, bottom) { this._left = NaN; this._top = NaN; this._right = NaN; this._bottom = NaN; this._left = 0; this._top = 0; this._right = 0; this._bottom = 0; if (left instanceof C3.Rect) this.copy(left); else this.set(left || 0, top || 0, right || 0, bottom || 0) } set(left, top, right, bottom) { this._left = +left; this._top = +top; this._right = +right; this._bottom = +bottom } setWH(left, top, width, height) { left = +left; top = +top; this._left = left; this._top = top; this._right = left + +width; this._bottom = top + +height } copy(rect) { this._left = +rect._left; this._top = +rect._top; this._right = +rect._right; this._bottom = +rect._bottom } clone() { return new C3.Rect(this._left,this._top,this._right,this._bottom) } static Merge(first, second) { const ret = new C3.Rect; ret.setLeft(Math.min(first._left, second._left)); ret.setTop(Math.min(first._top, second._top)); ret.setRight(Math.max(first._right, second._right)); ret.setBottom(Math.max(first._bottom, second._bottom)); return ret } static FromObject(o) { return new C3.Rect(o.left,o.top,o.right,o.bottom) } equals(rect) { return this._left === rect._left && this._top === rect._top && this._right === rect._right && this._bottom === rect._bottom } setLeft(l) { this._left = +l } getLeft() { return this._left } setTop(t) { this._top = +t } getTop() { return this._top } setRight(r) { this._right = +r } getRight() { return this._right } setBottom(b) { this._bottom = +b } getBottom() { return this._bottom } toArray() { return [this._left, this._top, this._right, this._bottom] } toTypedArray() { return new Float64Array(this.toArray()) } toDOMRect() { return new DOMRect(this._left,this._top,this.width(),this.height()) } writeToTypedArray(ta, i) { ta[i++] = this._left; ta[i++] = this._top; ta[i++] = this._right; ta[i] = this._bottom } writeAsQuadToTypedArray(ta, i) { ta[i++] = this._left; ta[i++] = this._top; ta[i++] = this._right; ta[i++] = this._top; ta[i++] = this._right; ta[i++] = this._bottom; ta[i++] = this._left; ta[i] = this._bottom } width() { return this._right - this._left } height() { return this._bottom - this._top } midX() { return (this._left + this._right) / 2 } midY() { return (this._top + this._bottom) / 2 } offset(x, y) { x = +x; y = +y; this._left += x; this._top += y; this._right += x; this._bottom += y } offsetLeft(x) { this._left += +x } offsetTop(y) { this._top += +y } offsetRight(x) { this._right += +x } offsetBottom(y) { this._bottom += +y } toSquare(axis) { if (axis !== "x") throw new Error("invalid axis, only 'x' supported"); if (this._top < this._bottom) if (this._left < this._right) this._bottom = this._top + this.width(); else this._bottom = this._top - this.width(); else if (this._left < this._right) this._bottom = this._top - this.width(); else this._bottom = this._top + this.width() } inflate(x, y) { x = +x; y = +y; this._left -= x; this._top -= y; this._right += x; this._bottom += y } deflate(x, y) { x = +x; y = +y; this._left += x; this._top += y; this._right -= x; this._bottom -= y } multiply(x, y) { this._left *= x; this._top *= y; this._right *= x; this._bottom *= y } divide(x, y) { this._left /= x; this._top /= y; this._right /= x; this._bottom /= y } mirrorAround(origin) { this._left = +origin - this._left; this._right = +origin - this._right } flipAround(origin) { this._top = +origin - this._top; this._bottom = +origin - this._bottom } swapLeftRight() { const temp = this._left; this._left = this._right; this._right = temp } swapTopBottom() { const temp = this._top; this._top = this._bottom; this._bottom = temp } shuntY(h) { const top = this._top; this._top = +h - this._bottom; this._bottom = +h - top } round() { this._left = Math.round(this._left); this._top = Math.round(this._top); this._right = Math.round(this._right); this._bottom = Math.round(this._bottom) } roundInner() { this._left = Math.ceil(this._left); this._top = Math.ceil(this._top); this._right = Math.floor(this._right); this._bottom = Math.floor(this._bottom) } roundOuter() { this._left = Math.floor(this._left); this._top = Math.floor(this._top); this._right = Math.ceil(this._right); this._bottom = Math.ceil(this._bottom) } floor() { this._left = Math.floor(this._left); this._top = Math.floor(this._top); this._right = Math.floor(this._right); this._bottom = Math.floor(this._bottom) } ceil() { this._left = Math.ceil(this._left); this._top = Math.ceil(this._top); this._right = Math.ceil(this._right); this._bottom = Math.ceil(this._bottom) } clamp(l, t, r, b) { if (this._left < l) this._left = +l; if (this._top < t) this._top = +t; if (this._right > r) this._right = +r; if (this._bottom > b) this._bottom = +b } clampFlipped(l, t, r, b) { if (this._left < l) this._left = +l; if (this._top > t) this._top = +t; if (this._right > r) this._right = +r; if (this._bottom < b) this._bottom = +b } normalize() { if (this._left > this._right) this.swapLeftRight(); if (this._top > this._bottom) this.swapTopBottom() } intersectsRect(rect) { return !(rect._right < this._left || rect._bottom < this._top || rect._left > this._right || rect._top > this._bottom) } intersectsRectOffset(rect, x, y) { return !(rect._right + x < this._left || rect._bottom + y < this._top || rect._left + x > this._right || rect._top + y > this._bottom) } containsPoint(x, y) { return x >= this._left && x <= this._right && y >= this._top && y <= this._bottom } containsRect(rect) { return rect._left >= this._left && rect._top >= this._top && rect._right <= this._right && rect._bottom <= this._bottom } expandToContain(rect) { if (rect._left < this._left) this._left = +rect._left; if (rect._top < this._top) this._top = +rect._top; if (rect._right > this._right) this._right = +rect._right; if (rect._bottom > this._bottom) this._bottom = +rect._bottom } lerpInto(rect) { this._left = C3.lerp(rect._left, rect._right, this._left); this._top = C3.lerp(rect._top, rect._bottom, this._top); this._right = C3.lerp(rect._left, rect._right, this._right); this._bottom = C3.lerp(rect._top, rect._bottom, this._bottom) } } } ;'use strict'; { const C3 = self.C3; C3.Quad = class Quad { constructor(tlx, tly, trx, try_, brx, bry, blx, bly) { this._tlx = NaN; this._tly = NaN; this._trx = NaN; this._try = NaN; this._brx = NaN; this._bry = NaN; this._blx = NaN; this._bly = NaN; this._tlx = 0; this._tly = 0; this._trx = 0; this._try = 0; this._brx = 0; this._bry = 0; this._blx = 0; this._bly = 0; if (tlx instanceof C3.Quad) this.copy(tlx); else this.set(tlx || 0, tly || 0, trx || 0, try_ || 0, brx || 0, bry || 0, blx || 0, bly || 0) } set(tlx, tly, trx, try_, brx, bry, blx, bly) { this._tlx = +tlx; this._tly = +tly; this._trx = +trx; this._try = +try_; this._brx = +brx; this._bry = +bry; this._blx = +blx; this._bly = +bly } setRect(left, top, right, bottom) { this.set(left, top, right, top, right, bottom, left, bottom) } copy(q) { this._tlx = q._tlx; this._tly = q._tly; this._trx = q._trx; this._try = q._try; this._brx = q._brx; this._bry = q._bry; this._blx = q._blx; this._bly = q._bly } equals(q) { return this._tlx === q._tlx && this._tly === q._tly && this._trx === q._trx && this._try === q._try && this._brx === q._brx && this._bry === q._bry && this._blx === q._blx && this._bly === q._bly } setTlx(v) { this._tlx = +v } getTlx() { return this._tlx } setTly(v) { this._tly = +v } getTly() { return this._tly } setTrx(v) { this._trx = +v } getTrx() { return this._trx } setTry(v) { this._try = +v } getTry() { return this._try } setBrx(v) { this._brx = +v } getBrx() { return this._brx } setBry(v) { this._bry = +v } getBry() { return this._bry } setBlx(v) { this._blx = +v } getBlx() { return this._blx } setBly(v) { this._bly = +v } getBly() { return this._bly } toDOMQuad() { return new DOMQuad(new DOMPoint(this._tlx,this._tly),new DOMPoint(this._trx,this._try),new DOMPoint(this._brx,this._bry),new DOMPoint(this._blx,this._bly)) } toArray() { return [this._tlx, this._tly, this._trx, this._try, this._brx, this._bry, this._blx, this._bly] } toTypedArray() { return new Float64Array(this.toArray()) } writeToTypedArray(ta, i) { ta[i++] = this._tlx; ta[i++] = this._tly; ta[i++] = this._trx; ta[i++] = this._try; ta[i++] = this._brx; ta[i++] = this._bry; ta[i++] = this._blx; ta[i] = this._bly } writeToTypedArray3D(ta, i, z) { ta[i++] = this._tlx; ta[i++] = this._tly; ta[i++] = z; ta[i++] = this._trx; ta[i++] = this._try; ta[i++] = z; ta[i++] = this._brx; ta[i++] = this._bry; ta[i++] = z; ta[i++] = this._blx; ta[i++] = this._bly; ta[i] = z } offset(x, y) { x = +x; y = +y; this._tlx += x; this._tly += y; this._trx += x; this._try += y; this._brx += x; this._bry += y; this._blx += x; this._bly += y } round() { this._tlx = Math.round(this._tlx); this._tly = Math.round(this._tly); this._trx = Math.round(this._trx); this._try = Math.round(this._try); this._brx = Math.round(this._brx); this._bry = Math.round(this._bry); this._blx = Math.round(this._blx); this._bly = Math.round(this._bly) } floor() { this._tlx = Math.floor(this._tlx); this._tly = Math.floor(this._tly); this._trx = Math.floor(this._trx); this._try = Math.floor(this._try); this._brx = Math.floor(this._brx); this._bry = Math.floor(this._bry); this._blx = Math.floor(this._blx); this._bly = Math.floor(this._bly) } ceil() { this._tlx = Math.ceil(this._tlx); this._tly = Math.ceil(this._tly); this._trx = Math.ceil(this._trx); this._try = Math.ceil(this._try); this._brx = Math.ceil(this._brx); this._bry = Math.ceil(this._bry); this._blx = Math.ceil(this._blx); this._bly = Math.ceil(this._bly) } setFromRect(rect) { this._tlx = rect._left; this._tly = rect._top; this._trx = rect._right; this._try = rect._top; this._brx = rect._right; this._bry = rect._bottom; this._blx = rect._left; this._bly = rect._bottom } setFromRotatedRect(rect, a) { if (a === 0) this.setFromRect(rect); else this.setFromRotatedRectPrecalc(rect, Math.sin(a), Math.cos(a)) } setFromRotatedRectPrecalc(rect, sin_a, cos_a) { const left_sin_a = rect._left * sin_a; const top_sin_a = rect._top * sin_a; const right_sin_a = rect._right * sin_a; const bottom_sin_a = rect._bottom * sin_a; const left_cos_a = rect._left * cos_a; const top_cos_a = rect._top * cos_a; const right_cos_a = rect._right * cos_a; const bottom_cos_a = rect._bottom * cos_a; this._tlx = left_cos_a - top_sin_a; this._tly = top_cos_a + left_sin_a; this._trx = right_cos_a - top_sin_a; this._try = top_cos_a + right_sin_a; this._brx = right_cos_a - bottom_sin_a; this._bry = bottom_cos_a + right_sin_a; this._blx = left_cos_a - bottom_sin_a; this._bly = bottom_cos_a + left_sin_a } getBoundingBox(rect) { rect.set(Math.min(this._tlx, this._trx, this._brx, this._blx), Math.min(this._tly, this._try, this._bry, this._bly), Math.max(this._tlx, this._trx, this._brx, this._blx), Math.max(this._tly, this._try, this._bry, this._bly)) } containsPoint(x, y) { let v0x = this._trx - this._tlx; let v0y = this._try - this._tly; const v1x = this._brx - this._tlx; const v1y = this._bry - this._tly; const v2x = x - this._tlx; const v2y = y - this._tly; let dot00 = v0x * v0x + v0y * v0y; let dot01 = v0x * v1x + v0y * v1y; let dot02 = v0x * v2x + v0y * v2y; const dot11 = v1x * v1x + v1y * v1y; const dot12 = v1x * v2x + v1y * v2y; let invDenom = 1 / (dot00 * dot11 - dot01 * dot01); let u = (dot11 * dot02 - dot01 * dot12) * invDenom; let v = (dot00 * dot12 - dot01 * dot02) * invDenom; if (u >= 0 && v > 0 && u + v < 1) return true; v0x = this._blx - this._tlx; v0y = this._bly - this._tly; dot00 = v0x * v0x + v0y * v0y; dot01 = v0x * v1x + v0y * v1y; dot02 = v0x * v2x + v0y * v2y; invDenom = 1 / (dot00 * dot11 - dot01 * dot01); u = (dot11 * dot02 - dot01 * dot12) * invDenom; v = (dot00 * dot12 - dot01 * dot02) * invDenom; return u >= 0 && v > 0 && u + v < 1 } midX() { return (this._tlx + this._trx + this._brx + this._blx) / 4 } midY() { return (this._tly + this._try + this._bry + this._bly) / 4 } intersectsSegment(x1, y1, x2, y2) { if (this.containsPoint(x1, y1) || this.containsPoint(x2, y2)) return true; return C3.segmentIntersectsQuad(x1, y1, x2, y2, this) } intersectsQuad(rhs) { let midX = rhs.midX(); let midY = rhs.midY(); if (this.containsPoint(midX, midY)) return true; midX = this.midX(); midY = this.midY(); if (rhs.containsPoint(midX, midY)) return true; const tlx = this._tlx , tly = this._tly , trx = this._trx , try_ = this._try , brx = this._brx , bry = this._bry , blx = this._blx , bly = this._bly; return C3.segmentIntersectsQuad(tlx, tly, trx, try_, rhs) || C3.segmentIntersectsQuad(trx, try_, brx, bry, rhs) || C3.segmentIntersectsQuad(brx, bry, blx, bly, rhs) || C3.segmentIntersectsQuad(blx, bly, tlx, tly, rhs) } mirror() { this._swap(0, 2); this._swap(1, 3); this._swap(6, 4); this._swap(7, 5) } flip() { this._swap(0, 6); this._swap(1, 7); this._swap(2, 4); this._swap(3, 5) } diag() { this._swap(2, 6); this._swap(3, 7) } _swap(i, j) { const tmp = this._getAtIndex(i); this._setAtIndex(i, this._getAtIndex(j)); this._setAtIndex(j, tmp) } _getAtIndex(i) { switch (i) { case 0: return this._tlx; case 1: return this._tly; case 2: return this._trx; case 3: return this._try; case 4: return this._brx; case 5: return this._bry; case 6: return this._blx; case 7: return this._bly; default: throw new RangeError("invalid quad point index"); } } _setAtIndex(i, v) { v = +v; switch (i) { case 0: this._tlx = v; break; case 1: this._tly = v; break; case 2: this._trx = v; break; case 3: this._try = v; break; case 4: this._brx = v; break; case 5: this._bry = v; break; case 6: this._blx = v; break; case 7: this._bly = v; break; default: throw new RangeError("invalid quad point index"); } } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; const DEFAULT_POLY_POINTS = [0, 0, 1, 0, 1, 1, 0, 1]; const tempQuad = C3.New(C3.Quad); C3.CollisionPoly = class CollisionPoly extends C3.DefendedBase { constructor(pointsArr, enabled=true) { super(); if (!pointsArr) pointsArr = DEFAULT_POLY_POINTS; this._ptsArr = Float64Array.from(pointsArr); this._bbox = new C3.Rect; this._isBboxChanged = true; this._enabled = enabled } Release() {} pointsArr() { return this._ptsArr } pointCount() { return this._ptsArr.length / 2 } setPoints(pointsArr) { if (this._ptsArr.length === pointsArr.length) this._ptsArr.set(pointsArr); else this._ptsArr = Float64Array.from(pointsArr); this._isBboxChanged = true } setDefaultPoints() { this.setPoints(DEFAULT_POLY_POINTS) } copy(poly) { this.setPoints(poly._ptsArr) } setBboxChanged() { this._isBboxChanged = true } _updateBbox() { if (!this._isBboxChanged) return; const ptsArr = this._ptsArr; let left = ptsArr[0]; let top = ptsArr[1]; let right = left; let bottom = top; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const x = ptsArr[i]; const y = ptsArr[i + 1]; if (x < left) left = x; if (x > right) right = x; if (y < top) top = y; if (y > bottom) bottom = y } this._bbox.set(left, top, right, bottom); this._isBboxChanged = false } setFromRect(rc, offX, offY) { let ptsArr = this._ptsArr; if (ptsArr.length !== 8) { ptsArr = new Float64Array(8); this._ptsArr = ptsArr } ptsArr[0] = rc.getLeft() - offX; ptsArr[1] = rc.getTop() - offY; ptsArr[2] = rc.getRight() - offX; ptsArr[3] = rc.getTop() - offY; ptsArr[4] = rc.getRight() - offX; ptsArr[5] = rc.getBottom() - offY; ptsArr[6] = rc.getLeft() - offX; ptsArr[7] = rc.getBottom() - offY; this._bbox.copy(rc); if (offX !== 0 || offY !== 0) this._bbox.offset(-offX, -offY); this._isBboxChanged = false } setFromQuad(q, offX, offY) { tempQuad.copy(q); tempQuad.offset(offX, offY); this.setPoints(tempQuad.toArray()); this._isBboxChanged = true } transform(w, h, a) { let sina = 0; let cosa = 1; if (a !== 0) { sina = Math.sin(a); cosa = Math.cos(a) } this.transformPrecalc(w, h, sina, cosa) } transformPrecalc(w, h, sina, cosa) { const ptsArr = this._ptsArr; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const j = i + 1; const x = ptsArr[i] * w; const y = ptsArr[j] * h; ptsArr[i] = x * cosa - y * sina; ptsArr[j] = y * cosa + x * sina } this._isBboxChanged = true } offset(x, y) { const ptsArr = this._ptsArr; for (let i = 0, len = ptsArr.length; i < len; i += 2) { ptsArr[i] += x; ptsArr[i + 1] += y } } containsPoint(a2x, a2y) { const ptsArr = this._ptsArr; if (a2x === ptsArr[0] && a2y === ptsArr[1]) return true; this._updateBbox(); const bbox = this._bbox; const a1x = bbox.getLeft() - 110; const a1y = bbox.getTop() - 101; const a3x = bbox.getRight() + 131; const a3y = bbox.getBottom() + 120; let minAx12 = 0; let minAy12 = 0; let maxAx12 = 0; let maxAy12 = 0; let minAx32 = 0; let minAy32 = 0; let maxAx32 = 0; let maxAy32 = 0; if (a1x < a2x) { minAx12 = a1x; maxAx12 = a2x } else { minAx12 = a2x; maxAx12 = a1x } if (a1y < a2y) { minAy12 = a1y; maxAy12 = a2y } else { minAy12 = a2y; maxAy12 = a1y } if (a3x < a2x) { minAx32 = a3x; maxAx32 = a2x } else { minAx32 = a2x; maxAx32 = a3x } if (a3y < a2y) { minAy32 = a3y; maxAy32 = a2y } else { minAy32 = a2y; maxAy32 = a3y } let count1 = 0; let count2 = 0; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const j = (i + 2) % len; const b1x = ptsArr[i]; const b1y = ptsArr[i + 1]; const b2x = ptsArr[j]; const b2y = ptsArr[j + 1]; if (C3.segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, minAx12, maxAx12, minAy12, maxAy12, b1x, b1y, b2x, b2y)) ++count1; if (C3.segmentsIntersectPreCalc(a3x, a3y, a2x, a2y, minAx32, maxAx32, minAy32, maxAy32, b1x, b1y, b2x, b2y)) ++count2 } return count1 % 2 === 1 || count2 % 2 === 1 } intersectsPoly(poly, offX, offY) { const rPts = poly._ptsArr; const lPts = this._ptsArr; if (this.containsPoint(rPts[0] + offX, rPts[1] + offY)) return true; if (poly.containsPoint(lPts[0] - offX, lPts[1] - offY)) return true; for (let i = 0, leni = lPts.length; i < leni; i += 2) { const j = (i + 2) % leni; const a1x = lPts[i]; const a1y = lPts[i + 1]; const a2x = lPts[j]; const a2y = lPts[j + 1]; let minAx = 0; let minAy = 0; let maxAx = 0; let maxAy = 0; if (a1x < a2x) { minAx = a1x; maxAx = a2x } else { minAx = a2x; maxAx = a1x } if (a1y < a2y) { minAy = a1y; maxAy = a2y } else { minAy = a2y; maxAy = a1y } for (let k = 0, lenk = rPts.length; k < lenk; k += 2) { const l = (k + 2) % lenk; const b1x = rPts[k] + offX; const b1y = rPts[k + 1] + offY; const b2x = rPts[l] + offX; const b2y = rPts[l + 1] + offY; if (C3.segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, minAx, maxAx, minAy, maxAy, b1x, b1y, b2x, b2y)) return true } } return false } intersectsSegment(offX, offY, a1x, a1y, a2x, a2y) { if (this.containsPoint(a1x - offX, a1y - offY)) return true; if (this.containsPoint(a2x - offX, a2y - offY)) return true; let minAx = 0; let minAy = 0; let maxAx = 0; let maxAy = 0; if (a1x < a2x) { minAx = a1x; maxAx = a2x } else { minAx = a2x; maxAx = a1x } if (a1y < a2y) { minAy = a1y; maxAy = a2y } else { minAy = a2y; maxAy = a1y } const ptsArr = this._ptsArr; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const j = (i + 2) % len; const b1x = ptsArr[i] + offX; const b1y = ptsArr[i + 1] + offY; const b2x = ptsArr[j] + offX; const b2y = ptsArr[j + 1] + offY; if (C3.segmentsIntersectPreCalc(a1x, a1y, a2x, a2y, minAx, maxAx, minAy, maxAy, b1x, b1y, b2x, b2y)) return true } return false } mirror(px) { const ptsArr = this._ptsArr; for (let i = 0, len = ptsArr.length; i < len; i += 2) ptsArr[i] = px * 2 - ptsArr[i]; this._isBboxChanged = true } flip(py) { const ptsArr = this._ptsArr; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const j = i + 1; ptsArr[j] = py * 2 - ptsArr[j] } this._isBboxChanged = true } diag() { const ptsArr = this._ptsArr; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const j = i + 1; const temp = ptsArr[i]; ptsArr[i] = ptsArr[j]; ptsArr[j] = temp } this._isBboxChanged = true } GetMidX() { const ptsArr = this._ptsArr; let ret = 0; for (let i = 0, len = ptsArr.length; i < len; i += 2) ret += ptsArr[i]; return ret / this.pointCount() } GetMidY() { const ptsArr = this._ptsArr; let ret = 0; for (let i = 0, len = ptsArr.length; i < len; i += 2) ret += ptsArr[i + 1]; return ret / this.pointCount() } GetPointsArray() { return this._ptsArr } GetPointCount() { return this.pointCount() } IsEnabled() { return this._enabled } } } ;'use strict'; { const C3 = self.C3; C3.PairMap = class PairMap extends C3.DefendedBase { constructor(iterable) { super(); this._firstMap = new Map; if (iterable) for (const [x,y,value] of iterable) this.Set(x, y, value) } Release() { this.Clear(); this._firstMap = null } Clear() { const firstMap = this._firstMap; for (const secondMap of firstMap.values()) secondMap.clear(); firstMap.clear() } Set(x, y, value) { const firstMap = this._firstMap; let secondMap = firstMap.get(x); if (!secondMap) { secondMap = new Map; firstMap.set(x, secondMap) } secondMap.set(y, value) } Get(x, y) { const secondMap = this._firstMap.get(x); if (!secondMap) return secondMap; return secondMap.get(y) } Has(x, y) { const secondMap = this._firstMap.get(x); if (!secondMap) return false; return secondMap.has(y) } Delete(x, y) { const firstMap = this._firstMap; const secondMap = firstMap.get(x); if (!secondMap) return false; const ret = secondMap.delete(y); if (ret && secondMap.size === 0) firstMap.delete(x); return ret } DeleteEither(k) { const firstMap = this._firstMap; const secondMap = firstMap.get(k); if (secondMap) { secondMap.clear(); firstMap.delete(k) } for (const [x,secondMap] of firstMap.entries()) if (secondMap.delete(k) && secondMap.size === 0) firstMap.delete(x) } GetSize() { let ret = 0; for (const secondMap of this._firstMap.values()) ret += secondMap.size; return ret } *values() { for (const secondMap of this._firstMap.values()) yield*secondMap.values() } *keyPairs() { for (const [x,secondMap] of this._firstMap.entries()) for (const y of secondMap.keys()) yield[x, y] } *entries() { for (const [x,secondMap] of this._firstMap.entries()) for (const [y,value] of secondMap.entries()) yield[x, y, value] } } } ;'use strict'; { const C3 = self.C3; C3.ArraySet = class ArraySet extends C3.DefendedBase { constructor() { super(); this._set = new Set; this._arr = []; this._needToRebuildArray = false } Release() { this.Clear() } Clear() { this._set.clear(); C3.clearArray(this._arr); this._needToRebuildArray = false } Add(v) { if (this._set.has(v)) return; this._set.add(v); if (!this._needToRebuildArray) this._arr.push(v) } Has(v) { return this._set.has(v) } Delete(v) { if (this._set.delete(v)) this._needToRebuildArray = true } GetSize() { return this._set.size } IsEmpty() { return this._set.size === 0 } GetArray() { if (this._needToRebuildArray) { this._RebuildArray(); this._needToRebuildArray = false } return this._arr } _RebuildArray() { const arr = this._arr; C3.clearArray(arr); for (const v of this._set) arr.push(v) } } } ;'use strict'; { const C3 = self.C3; const EASE_MAP = new Map; const PREDEFINED_EASE_MAP = new Map; const CUSTOM_EASE_EDITOR_MAP = new Map; const CUSTOM_EASE_RUNTIME_MAP = new Map; const PRIVATE_EASE_MAP = new Map; const ALIAS_MAP = new Map; ALIAS_MAP.set("linear", "noease"); ALIAS_MAP.set("default", "noease"); self.Ease = class Ease { constructor() {} static InheritEase() { return "default" } static DefaultEase() { return "noease" } static GetEditorEaseNames(project, ...filter) { this._CreateEaseMap(); if (!CUSTOM_EASE_EDITOR_MAP.has(project)) CUSTOM_EASE_EDITOR_MAP.set(project, new Map); const customEaseMap = CUSTOM_EASE_EDITOR_MAP.get(project); return [...PREDEFINED_EASE_MAP.keys()].concat([...customEaseMap.keys()]).filter(ease=>!filter.includes(ease)) } static GetRuntimeEaseNames() { this._CreateEaseMap(); return [...PREDEFINED_EASE_MAP.keys()].concat([...CUSTOM_EASE_RUNTIME_MAP.keys()]) } static IsNamePredefined(easeName) { this._CreateEaseMap(); return [...PREDEFINED_EASE_MAP.keys()].includes(easeName) } static _GetEase(easeName) { const realEaseName = ALIAS_MAP.get(easeName); if (realEaseName) return EASE_MAP.get(realEaseName); if (Ease.IsNamePredefined(easeName)) return EASE_MAP.get(easeName); if (PRIVATE_EASE_MAP.has(easeName)) return PRIVATE_EASE_MAP.get(easeName) } static GetEditorEase(easeName, project) { this._CreateEaseMap(); const ease = Ease._GetEase(easeName); if (ease) return ease; return CUSTOM_EASE_EDITOR_MAP.get(project).get(easeName) } static GetRuntimeEase(easeName) { this._CreateEaseMap(); const ease = Ease._GetEase(easeName); if (ease) return ease; return CUSTOM_EASE_RUNTIME_MAP.get(easeName) } static GetEaseFromIndex(index) { this._CreateEaseMap(); const names = this.GetRuntimeEaseNames(); return names[index] } static GetIndexForEase(name, project) { this._CreateEaseMap(); const names = this.GetEditorEaseNames(project); return names.indexOf(name) } static _CreateEaseMap() { if (EASE_MAP.size !== 0) return; this._AddPredifinedEase("default", ()=>{} ); this._AddPredifinedEase("noease", this.NoEase); this._AddPredifinedEase("easeinsine", this.EaseInSine); this._AddPredifinedEase("easeoutsine", this.EaseOutSine); this._AddPredifinedEase("easeinoutsine", this.EaseInOutSine); this._AddPredifinedEase("easeinelastic", this.EaseInElastic); this._AddPredifinedEase("easeoutelastic", this.EaseOutElastic); this._AddPredifinedEase("easeinoutelastic", this.EaseInOutElastic); this._AddPredifinedEase("easeinback", this.EaseInBack); this._AddPredifinedEase("easeoutback", this.EaseOutBack); this._AddPredifinedEase("easeinoutback", this.EaseInOutBack); this._AddPredifinedEase("easeinbounce", this.EaseInBounce); this._AddPredifinedEase("easeoutbounce", this.EaseOutBounce); this._AddPredifinedEase("easeinoutbounce", this.EaseInOutBounce); this._AddPredifinedEase("easeincubic", this.EaseInCubic); this._AddPredifinedEase("easeoutcubic", this.EaseOutCubic); this._AddPredifinedEase("easeinoutcubic", this.EaseInOutCubic); this._AddPredifinedEase("easeinquad", this.EaseInQuad); this._AddPredifinedEase("easeoutquad", this.EaseOutQuad); this._AddPredifinedEase("easeinoutquad", this.EaseInOutQuad); this._AddPredifinedEase("easeinquart", this.EaseInQuart); this._AddPredifinedEase("easeoutquart", this.EaseOutQuart); this._AddPredifinedEase("easeinoutquart", this.EaseInOutQuart); this._AddPredifinedEase("easeinquint", this.EaseInQuint); this._AddPredifinedEase("easeoutquint", this.EaseOutQuint); this._AddPredifinedEase("easeinoutquint", this.EaseInOutQuint); this._AddPredifinedEase("easeincirc", this.EaseInCirc); this._AddPredifinedEase("easeoutcirc", this.EaseOutCirc); this._AddPredifinedEase("easeinoutcirc", this.EaseInOutCirc); this._AddPredifinedEase("easeinexpo", this.EaseInExpo); this._AddPredifinedEase("easeoutexpo", this.EaseOutExpo); this._AddPredifinedEase("easeinoutexpo", this.EaseInOutExpo); this._AddPrivateCustomEase("cubicbezier", this.EaseCubicBezier); this._AddPrivateCustomEase("spline", this.EaseSpline) } static _AddPredifinedEase(name, func) { Ease._AddEase(name, func, "predefined") } static _AddPrivateCustomEase(name, func) { Ease._AddEase(name, func, "private") } static AddCustomEase(name, func, project) { this._CreateEaseMap(); Ease._AddEase(name, func, "custom", project) } static RemoveCustomEase(name, project) { if (this.IsNamePredefined(name)) return; if ([...PRIVATE_EASE_MAP.keys()].includes(name)) return; const customEaseMap = CUSTOM_EASE_EDITOR_MAP.get(project); if (customEaseMap) customEaseMap.delete(name) } static _AddEase(name, func, mode, project) { switch (mode) { case "predefined": EASE_MAP.set(name, func); PREDEFINED_EASE_MAP.set(name, func); break; case "custom": if (project) { if (!CUSTOM_EASE_EDITOR_MAP.has(project)) CUSTOM_EASE_EDITOR_MAP.set(project, new Map); const customEaseMap = CUSTOM_EASE_EDITOR_MAP.get(project); customEaseMap.set(name, func) } else CUSTOM_EASE_RUNTIME_MAP.set(name, func); break; case "private": EASE_MAP.set(name, func); PRIVATE_EASE_MAP.set(name, func); break; default: throw new Error("unexpected ease mode"); } } static NoEase(t, b, c, d) { return c * t / d + b } static EaseInQuad(t, b, c, d) { return c * (t /= d) * t + b } static EaseOutQuad(t, b, c, d) { return -c * (t /= d) * (t - 2) + b } static EaseInOutQuad(t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t + b; return -c / 2 * (--t * (t - 2) - 1) + b } static EaseInCubic(t, b, c, d) { return c * (t /= d) * t * t + b } static EaseOutCubic(t, b, c, d) { return c * ((t = t / d - 1) * t * t + 1) + b } static EaseInOutCubic(t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; return c / 2 * ((t -= 2) * t * t + 2) + b } static EaseInQuart(t, b, c, d) { return c * (t /= d) * t * t * t + b } static EaseOutQuart(t, b, c, d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b } static EaseInOutQuart(t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; return -c / 2 * ((t -= 2) * t * t * t - 2) + b } static EaseInQuint(t, b, c, d) { return c * (t /= d) * t * t * t * t + b } static EaseOutQuint(t, b, c, d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b } static EaseInOutQuint(t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; return c / 2 * ((t -= 2) * t * t * t * t + 2) + b } static EaseInSine(t, b, c, d) { return -c * Math.cos(t / d * (Math.PI / 2)) + c + b } static EaseOutSine(t, b, c, d) { return c * Math.sin(t / d * (Math.PI / 2)) + b } static EaseInOutSine(t, b, c, d) { return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b } static EaseInExpo(t, b, c, d) { return t === 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b } static EaseOutExpo(t, b, c, d) { return t === d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b } static EaseInOutExpo(t, b, c, d) { if (t === 0) return b; if (t === d) return b + c; if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b } static EaseInCirc(t, b, c, d) { return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b } static EaseOutCirc(t, b, c, d) { return c * Math.sqrt(1 - (t = t / d - 1) * t) + b } static EaseInOutCirc(t, b, c, d) { if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b } static EaseInElastic(t, b, c, d) { let s = 1.70158; let p = 0; let a = c; if (t === 0) return b; if ((t /= d) === 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; s = p / 4 } else s = p / (2 * Math.PI) * Math.asin(c / a); return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b } static EaseOutElastic(t, b, c, d) { let s = 1.70158; let p = 0; let a = c; if (t === 0) return b; if ((t /= d) === 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; s = p / 4 } else s = p / (2 * Math.PI) * Math.asin(c / a); return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b } static EaseInOutElastic(t, b, c, d) { let s = 1.70158; let p = 0; let a = c; if (t === 0) return b; if ((t /= d / 2) === 2) return b + c; if (!p) p = d * (.3 * 1.5); if (a < Math.abs(c)) { a = c; s = p / 4 } else s = p / (2 * Math.PI) * Math.asin(c / a); if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b } static EaseInBack(t, b, c, d, s) { if (s === undefined) s = 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b } static EaseOutBack(t, b, c, d, s) { if (s === undefined) s = 1.70158; return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b } static EaseInOutBack(t, b, c, d, s) { if (s === undefined) s = 1.70158; if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b; return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b } static EaseInBounce(t, b, c, d) { return c - Ease.EaseOutBounce(d - t, 0, c, d) + b } static EaseOutBounce(t, b, c, d) { if ((t /= d) < 1 / 2.75) return c * (7.5625 * t * t) + b; else if (t < 2 / 2.75) return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b; else if (t < 2.5 / 2.75) return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b; else return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b } static EaseInOutBounce(t, b, c, d) { if (t < d / 2) return Ease.EaseInBounce(t * 2, 0, c, d) * .5 + b; return Ease.EaseOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b } static EaseCubicBezier(t, p0, p1, p2, p3) { const _0 = p0; const _1 = 3 * t * (p1 - p0); const _2 = 3 * t ** 2 * (p0 + p2 - 2 * p1); const _3 = t ** 3 * (p3 - p0 + 3 * p1 - 3 * p2); return _0 + _1 + _2 + _3 } static EaseSpline(t, sx, sy, x1, y1, x2, y2, ex, ey, samples) { if (x1 === y1 && x2 === y2) return t; const tx = get_t_for_x(t, sx, x1, x2, ex, samples); const va = a(sy, y1, y2, ey); const vb = b(sy, y1, y2, ey); const vc = c(sy, y1, y2, ey); return calc_bezier(tx, va, vb, vc) } static GetBezierSamples(startx, a1x, a2x, endx) { const ret = []; const va = a(startx, a1x, a2x, endx); const vb = b(startx, a1x, a2x, endx); const vc = c(startx, a1x, a2x, endx); for (let i = 0; i < SAMPLE_COUNT; ++i) { const sample = calc_bezier(i * SAMPLE_STEP, va, vb, vc); ret.push(sample) } return ret } } ; const SAMPLE_COUNT = 11; const SAMPLE_STEP = 1 / (SAMPLE_COUNT - 1); const NEWTON_RAPHSON_ITERATIONS = 4; const NEWTON_RAPHSON_MIN_SLOPE = .02; const SUBDIVISION_PRECISION = 1E-7; const SUBDIVISION_MAX_ITERATIONS = 10; const a = (p0,p1,p2,p3)=>{ return p3 - 3 * p2 + 3 * p1 - p0 } ; const b = (p0,p1,p2,p3)=>{ return 3 * p2 - 6 * p1 + 3 * p0 } ; const c = (p0,p1,p2,p3)=>{ return 3 * (p1 - p0) } ; const calc_bezier = (aT,a,b,c)=>{ return ((a * aT + b) * aT + c) * aT } ; const get_slope = (aT,a,b,c)=>{ return 3 * a * aT * aT + 2 * b * aT + c } ; const get_t_for_x = (aX,p0,p1,p2,p3,samples)=>{ if (aX == 1) return 1; let intervalStart = 0; let currentSampleIndex = 1; let currentSampleValue = samples[currentSampleIndex]; let lastSampleIndex = SAMPLE_COUNT - 1; let lastSampleValue = samples[SAMPLE_COUNT - 1]; while (currentSampleIndex != lastSampleIndex && currentSampleValue <= aX) { currentSampleIndex++; currentSampleValue = samples[currentSampleIndex]; intervalStart += SAMPLE_STEP } currentSampleIndex--; currentSampleValue = samples[currentSampleIndex]; const dist = (aX - currentSampleValue) / (samples[currentSampleIndex + 1] - currentSampleValue); let guess = intervalStart + dist * SAMPLE_STEP; const va = a(p0, p1, p2, p3); const vb = b(p0, p1, p2, p3); const vc = c(p0, p1, p2, p3); const initSlope = get_slope(guess, va, vb, vc); if (initSlope === 0) return guess; else if (initSlope >= NEWTON_RAPHSON_MIN_SLOPE) { for (let i = 0; i < NEWTON_RAPHSON_ITERATIONS; ++i) { const x = calc_bezier(guess, va, vb, vc) - aX; const slope = get_slope(guess, va, vb, vc); guess -= x / slope } return guess } else { let aA = intervalStart; let aB = intervalStart + SAMPLE_STEP; let i = 0; let precissionLimit; let maxIterations; do { guess = aA + (aB - aA) / 2; let x = calc_bezier(guess, va, vb, vc) - aX; if (x > 0) aB = guess; else aA = guess; precissionLimit = Math.abs(x) > SUBDIVISION_PRECISION; maxIterations = ++i < SUBDIVISION_MAX_ITERATIONS } while (precissionLimit && maxIterations); return guess } } } ;'use strict'; { const C3 = self.C3; function RequireStringOrNumber(value) { if (!C3.IsString(value)) ; } C3.ProbabilityTable = class ProbabilityTable { constructor() { this._items = []; this._totalWeight = 0 } Release() { this.Clear(); this._items = null } Clear() { C3.clear2DArray(this._items); this._totalWeight = 0 } GetTotalWeight() { return this._totalWeight } Sample(t=Math.random() * this.GetTotalWeight()) { let sumWeight = 0; for (const [weight,value] of this._items) { sumWeight += weight; if (t < sumWeight) return value } return 0 } AddItem(weight, value) { RequireStringOrNumber(value); this._totalWeight += weight; this._items.push([weight, value]) } RemoveItem(weight, value) { RequireStringOrNumber(value); const ignoreWeight = weight === 0; for (let i = 0; i < this._items.length; i++) { const item = this._items[i]; const doesWeightMatch = ignoreWeight || item[0] === weight; const doesValueMatch = item[1] === value; if (doesWeightMatch && doesValueMatch) { this._items.splice(i, 1); this._totalWeight -= item[0]; break } } } asJSON() { return JSON.stringify(this._items) } static fromJSON(str) { const table = new C3.ProbabilityTable; const items = JSON.parse(str); for (const item of items) { const weight = item[0]; const value = item[1]; table.AddItem(weight, value) } return table } } } ;'use strict'; { const C3 = self.C3; C3.Event = class Event { constructor(type, cancelable) { this.type = type; this.cancelable = !!cancelable; this.defaultPrevented = false; this.propagationStopped = false; this.isAsync = false } preventDefault() { if (!this.cancelable) throw new Error(`event '${this.type}' is not cancelable`); this.defaultPrevented = true } stopPropagation() { if (!this.cancelable) throw new Error(`event '${this.type}' cannot be stopped`); if (this.isAsync) throw new Error(`cannot stop async event '${this.type}' propagation`); this.propagationStopped = true } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; C3.Event.Handler = class EventHandler extends C3.DefendedBase { constructor(type) { super(); this._type = type; this._captureListeners = []; this._captureListenersSet = new Set; this._listeners = []; this._listenersSet = new Set; this._fireDepth = 0; this._queueAddListeners = []; this._queueRemoveCaptureListeners = []; this._queueRemoveListeners = [] } Release() { if (this._fireDepth > 0) return; C3.clearArray(this._captureListeners); this._captureListenersSet.clear(); C3.clearArray(this._listeners); this._listenersSet.clear(); C3.clearArray(this._queueAddListeners); C3.clearArray(this._queueRemoveCaptureListeners); C3.clearArray(this._queueRemoveListeners); C3.Release(this) } _AddListener(func, capture) { if (this._IsFiring()) { this._queueAddListeners.push([func, capture]); return } if (capture) { if (this._captureListenersSet.has(func)) return; this._captureListeners.push(func); this._captureListenersSet.add(func) } else { if (this._listenersSet.has(func)) return; this._listeners.push(func); this._listenersSet.add(func) } } _RemoveListener(func, capture) { if (this._IsFiring()) { if (capture) this._queueRemoveCaptureListeners.push(func); else this._queueRemoveListeners.push(func); return } if (capture) { if (this._captureListenersSet.has(func)) { this._captureListenersSet.delete(func); C3.arrayFindRemove(this._captureListeners, func) } } else if (this._listenersSet.has(func)) { this._listenersSet.delete(func); C3.arrayFindRemove(this._listeners, func) } } _IsEmpty() { return !this._captureListeners.length && !this._listeners.length } _IsFiring() { return this._fireDepth > 0 } _ProcessQueuedListeners() { for (let q of this._queueAddListeners) this._AddListener(...q); C3.clearArray(this._queueAddListeners); for (const func of this._queueRemoveListeners) this._listenersSet.delete(func); for (const func of this._queueRemoveCaptureListeners) this._captureListenersSet.delete(func); const removeListenersSet = new Set(this._queueRemoveListeners); const removeCaptureListenersSet = new Set(this._queueRemoveCaptureListeners); C3.arrayRemoveAllInSet(this._listeners, removeListenersSet); C3.arrayRemoveAllInSet(this._captureListeners, removeCaptureListenersSet); C3.clearArray(this._queueRemoveCaptureListeners); C3.clearArray(this._queueRemoveListeners) } _FireCancellable(event) { this._IncreaseFireDepth(); let isStopped = false; for (let i = 0, len = this._captureListeners.length; i < len; ++i) { this._captureListeners[i](event); if (event.propagationStopped) { isStopped = true; break } } if (!isStopped) for (let i = 0, len = this._listeners.length; i < len; ++i) { this._listeners[i](event); if (event.propagationStopped) break } this._DecreaseFireDepth(); return !event.defaultPrevented } _FireNonCancellable(event) { this._IncreaseFireDepth(); for (let i = 0, len = this._captureListeners.length; i < len; ++i) this._captureListeners[i](event); for (let i = 0, len = this._listeners.length; i < len; ++i) this._listeners[i](event); this._DecreaseFireDepth(); return true } _IncreaseFireDepth() { this._fireDepth++ } _DecreaseFireDepth() { this._fireDepth--; if (this._fireDepth === 0 && (this._queueAddListeners.length || this._queueRemoveCaptureListeners.length || this._queueRemoveListeners.length)) this._ProcessQueuedListeners() } SetDelayRemoveEventsEnabled(e) { if (e) this._IncreaseFireDepth(); else this._DecreaseFireDepth() } _FireAsync(event) { let callbackPromises = []; for (let i = 0, len = this._captureListeners.length; i < len; ++i) { let func = this._captureListeners[i]; callbackPromises.push(C3.Asyncify(()=>func(event))) } for (let i = 0, len = this._listeners.length; i < len; ++i) { let func = this._listeners[i]; callbackPromises.push(C3.Asyncify(()=>func(event))) } return Promise.all(callbackPromises).then(()=>!event.defaultPrevented) } _FireAndWait_AsyncOptional(event) { const results = []; this._IncreaseFireDepth(); for (let i = 0, len = this._captureListeners.length; i < len; ++i) { const ret = this._captureListeners[i](event); if (ret instanceof Promise) results.push(ret) } for (let i = 0, len = this._listeners.length; i < len; ++i) { const ret = this._listeners[i](event); if (ret instanceof Promise) results.push(ret) } this._DecreaseFireDepth(); if (results.length) return Promise.all(results).then(()=>!event.defaultPrevented); else return !event.defaultPrevented } async _FireAndWaitAsync(event) { return await this._FireAndWait_AsyncOptional(event) } async _FireAndWaitAsyncSequential(event) { this._IncreaseFireDepth(); for (let i = 0, len = this._captureListeners.length; i < len; ++i) { const ret = this._captureListeners[i](event); if (ret instanceof Promise) await ret } for (let i = 0, len = this._listeners.length; i < len; ++i) { const ret = this._listeners[i](event); if (ret instanceof Promise) await ret } this._DecreaseFireDepth(); return !event.defaultPrevented } *_FireAsGenerator(event) { this._IncreaseFireDepth(); for (let i = 0, len = this._captureListeners.length; i < len; ++i) { const ret = this._captureListeners[i](event); if (C3.IsIterator(ret)) yield*ret } for (let i = 0, len = this._listeners.length; i < len; ++i) { const ret = this._listeners[i](event); if (C3.IsIterator(ret)) yield*ret } this._DecreaseFireDepth() } } } ;'use strict'; { const C3 = self.C3; C3.Event.Dispatcher = class EventDispatcher extends C3.DefendedBase { constructor() { super(); this._eventHandlers = new Map; this._dispatcherWasReleased = false } Release() { if (this._dispatcherWasReleased) throw new Error("already released"); this.ClearEvents(); this._dispatcherWasReleased = true; C3.Release(this) } WasReleased() { return this._dispatcherWasReleased } ClearEvents() { for (let handler of this._eventHandlers.values()) handler.Release(); this._eventHandlers.clear() } _GetHandlerByType(type, create_if_missing) { let handler = this._eventHandlers.get(type); if (handler) return handler; if (create_if_missing) { handler = C3.New(C3.Event.Handler, type); this._eventHandlers.set(type, handler); return handler } return null } HasAnyHandlerFor(type) { return this._eventHandlers.has(type) } addEventListener(type, func, capture) { let handler = this._GetHandlerByType(type, true); handler._AddListener(func, !!capture) } removeEventListener(type, func, capture) { let handler = this._GetHandlerByType(type, false); if (!handler) return; handler._RemoveListener(func, !!capture); if (handler._IsEmpty()) this._eventHandlers.delete(type) } dispatchEvent(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return true; if (event.cancelable) return handler._FireCancellable(event); else return handler._FireNonCancellable(event) } dispatchEventAsync(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return Promise.resolve(true); event.isAsync = true; return handler._FireAsync(event) } async dispatchEventAndClearAsync(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return true; this._eventHandlers.delete(event.type); event.isAsync = true; const ret = await handler._FireAsync(event); handler.Release(); return ret } async dispatchEventAndWaitAsync(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return true; return await handler._FireAndWaitAsync(event) } dispatchEventAndWait_AsyncOptional(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return true; return handler._FireAndWait_AsyncOptional(event) } async dispatchEventAndWaitAsyncSequential(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return true; return await handler._FireAndWaitAsyncSequential(event) } dispatchGeneratorEvent(event) { const handler = this._GetHandlerByType(event.type, false); if (!handler) return null; if (event.cancelable) throw new Error("not supported"); else return handler._FireAsGenerator(event) } SetDelayRemoveEventsEnabled(e) { for (const handler of this._eventHandlers.values()) handler.SetDelayRemoveEventsEnabled(e) } } } ;'use strict'; { const C3 = self.C3; const SETTIMEOUT_WORK_DURATION = 12; const SETTIMEOUT_INTERVAL = 16; const IDLECALLBACK_TIMEOUT = 35; const SUPPORTS_RIC = typeof requestIdleCallback !== "undefined"; let workQueue = []; let callbackId = -1; let highThroughputMode = 0; function SetNewCallback(timerTimeout) { if (SUPPORTS_RIC && highThroughputMode === 0) callbackId = requestIdleCallback(DoAsyncifiedWork, { timeout: IDLECALLBACK_TIMEOUT }); else callbackId = setTimeout(DoAsyncifiedWork, highThroughputMode > 0 ? 1 : timerTimeout) } function DoAsyncifiedWork(deadline) { callbackId = -1; if (!workQueue.length) return; let startTime = performance.now(); let curTime = startTime; let jobCount = 0; let estimatedNextJobDuration = 0; do { DoNextAsyncifiedJob(workQueue.shift()); curTime = performance.now(); ++jobCount; estimatedNextJobDuration = (curTime - startTime) / jobCount * 1.1 } while (workQueue.length && (SUPPORTS_RIC && highThroughputMode === 0 && typeof deadline !== "undefined" ? estimatedNextJobDuration < deadline["timeRemaining"]() : curTime - startTime + estimatedNextJobDuration < SETTIMEOUT_WORK_DURATION)); if (callbackId === -1 && workQueue.length) { let workDuration = curTime - startTime; let timeout = Math.max(SETTIMEOUT_INTERVAL - workDuration, 4); SetNewCallback(timeout) } } function DoNextAsyncifiedJob(w) { let ret; try { ret = w.func() } catch (e) { w.reject(e); return } w.resolve(ret) } let asyncifyDisabled = C3.QueryString.Has("disable-asyncify"); if (asyncifyDisabled) console.warn("[Asyncify] Asyncify has been disabled due to disable-asyncify in the query string. Some work will now be done synchronously."); C3.Asyncify = function Asyncify(func) { let stack = null; if (C3.isDebug) stack = C3.GetCallStack(); return new Promise((resolve,reject)=>{ workQueue.push({ func: func, resolve: resolve, reject: reject, stack: stack }); if (asyncifyDisabled) { DoNextAsyncifiedJob(workQueue.pop()); return } if (callbackId === -1) SetNewCallback(SETTIMEOUT_INTERVAL) } ) } ; C3.Asyncify.SetHighThroughputMode = function SetHighThroughputMode(m) { if (m) ++highThroughputMode; else { --highThroughputMode; if (highThroughputMode < 0) throw new Error("already turned off high throughput mode"); } } } ;'use strict'; { const C3 = self.C3; const IDLE_CHECK_MIN_INTERVAL = 1E3; const IDLE_CHECK_TIMER_OVERSHOOT = 100; let cachedNowTime = -1; function ClearTimeCache() { cachedNowTime = -1 } C3.FastGetDateNow = function FastGetDateNow() { if (cachedNowTime === -1) { cachedNowTime = Date.now(); self.setTimeout(ClearTimeCache, 16) } return cachedNowTime } ; let timerId = -1; let nextDeadline = -1; let activeIdleTimeouts = new Set; function CheckActiveIdleTimeouts() { timerId = -1; nextDeadline = -1; let nowTime = Date.now(); for (let i of activeIdleTimeouts) if (i._CheckTimeout(nowTime)) { let deadline = i._GetDeadline(); if (nextDeadline === -1 || deadline < nextDeadline) nextDeadline = deadline } else activeIdleTimeouts.delete(i); if (nextDeadline !== -1) { let duration = Math.max(nextDeadline - nowTime + IDLE_CHECK_TIMER_OVERSHOOT, IDLE_CHECK_MIN_INTERVAL); timerId = self.setTimeout(CheckActiveIdleTimeouts, duration) } } C3.IdleTimeout = class IdleTimeout { constructor(callback, timeoutInSeconds) { this._callback = callback; this._timeout = timeoutInSeconds * 1E3; this._deadline = 0; this._isActive = false } Reset() { let nowTime = C3.FastGetDateNow(); this._deadline = nowTime + this._timeout; if (!this._isActive) { activeIdleTimeouts.add(this); this._isActive = true } if (timerId === -1) { nextDeadline = this._deadline; timerId = self.setTimeout(CheckActiveIdleTimeouts, this._timeout + IDLE_CHECK_TIMER_OVERSHOOT) } else if (this._deadline < nextDeadline && nextDeadline > nowTime + IDLE_CHECK_MIN_INTERVAL) { self.clearTimeout(timerId); nextDeadline = this._deadline; timerId = self.setTimeout(CheckActiveIdleTimeouts, this._timeout + IDLE_CHECK_TIMER_OVERSHOOT) } } _CheckTimeout(nowTime) { if (nowTime >= this._deadline) { if (this._callback()) { this._deadline = nowTime + this._timeout; return true } this._isActive = false; return false } return true } _GetDeadline() { return this._deadline } Cancel() { if (this._isActive) { activeIdleTimeouts.delete(this); this._isActive = false; if (activeIdleTimeouts.size === 0 && timerId !== -1) { self.clearTimeout(timerId); timerId = -1; nextDeadline = -1 } } } Release() { this.Cancel(); this._callback = null } } } ;'use strict'; { const C3 = self.C3; C3.Disposable = class Disposable { constructor(disposeAction) { this._disposed = false; this._disposeAction = disposeAction } Dispose() { if (this._disposed) return; this._disposed = true; if (this._disposeAction) { this._disposeAction(); this._disposeAction = null } } IsDisposed() { return this._disposed } Release() { this.Dispose() } static Release(instance) { return new Disposable(()=>instance.Release()) } static From(eventDispatcher, eventNames, eventHandler, opts, scope) { if (typeof opts === "undefined" || opts === null) opts = false; else if (typeof opts !== "boolean" && typeof opts !== "object") throw new TypeError("invalid event listener options"); if (scope) eventHandler = eventHandler.bind(scope); if (eventNames.includes(" ")) { eventNames = eventNames.split(" "); const disposable = new C3.CompositeDisposable; for (let eventName of eventNames) { eventDispatcher.addEventListener(eventName, eventHandler, opts); disposable.Add(C3.New(C3.Disposable, ()=>eventDispatcher.removeEventListener(eventName, eventHandler, opts))) } return disposable } else { eventDispatcher.addEventListener(eventNames, eventHandler, opts); return C3.New(C3.Disposable, ()=>eventDispatcher.removeEventListener(eventNames, eventHandler, opts)) } } } ; C3.StubDisposable = class StubDisposable extends C3.Disposable { SetAction(disposeAction) { this._disposeAction = disposeAction } } ; C3.CompositeDisposable = class CompositeDisposable extends C3.Disposable { constructor(...disposables) { super(); this._disposables = new Set; for (let disposable of disposables) this.Add(disposable) } Add(...disposables) { if (this._disposed) throw new Error("already disposed"); for (let disposable of disposables) this._disposables.add(disposable) } Remove(disposable) { if (this._disposed) throw new Error("already disposed"); this._disposables.delete(disposable) } RemoveAll() { if (this._disposed) throw new Error("already disposed"); if (!this._disposables) return; for (let disposable of this._disposables) disposable.Dispose(); this._disposables.clear() } IsDisposed() { return this._disposed } Dispose() { if (this._disposed) throw new Error("already disposed"); this._disposed = true; for (let disposable of this._disposables) disposable.Dispose(); this._disposables.clear(); this._disposables = null } Release() { this.Dispose() } } } ;'use strict'; { const C3 = self.C3; C3.KahanSum = class KahanSum extends C3.DefendedBase { constructor() { super(); this._c = 0; this._y = 0; this._t = 0; this._sum = 0 } Add(v) { v = +v; this._y = v - this._c; this._t = this._sum + this._y; this._c = this._t - this._sum - this._y; this._sum = this._t } Subtract(v) { this._sum -= +v } Get() { return this._sum } Reset() { this._c = 0; this._y = 0; this._t = 0; this._sum = 0 } Set(s) { this._c = 0; this._y = 0; this._t = 0; this._sum = +s } Release() {} } } ;'use strict'; { const C3 = self.C3; const js_cols = {}; const RED = true; const BLACK = false; js_cols.RBnode = function(tree) { this.tree = tree; this.right = this.tree.sentinel; this.left = this.tree.sentinel; this.parent = null; this.color = false; this.key = null } ; js_cols.RedBlackSet = function(compare_func) { this.size = 0; this.sentinel = new js_cols.RBnode(this); this.sentinel.color = BLACK; this.root = this.sentinel; this.root.parent = this.sentinel; this.compare = compare_func || this.default_compare } ; js_cols.RedBlackSet.prototype.default_compare = function(a, b) { if (a < b) return -1; else if (b < a) return 1; else return 0 } ; js_cols.RedBlackSet.prototype.clone = function() { var rv = new js_cols.RedBlackSet(this.compare); rv.insertAll(this); return rv } ; js_cols.RedBlackSet.prototype.clear = function() { this.size = 0; this.sentinel = new js_cols.RBnode(this); this.sentinel.color = BLACK; this.root = this.sentinel; this.root.parent = this.sentinel } ; js_cols.RedBlackSet.prototype.leftRotate = function(x) { var y = x.right; x.right = y.left; if (y.left != this.sentinel) y.left.parent = x; y.parent = x.parent; if (x.parent == this.sentinel) this.root = y; else if (x == x.parent.left) x.parent.left = y; else x.parent.right = y; y.left = x; x.parent = y } ; js_cols.RedBlackSet.prototype.rightRotate = function(x) { var y = x.left; x.left = y.right; if (y.right != this.sentinel) y.right.parent = x; y.parent = x.parent; if (x.parent == this.sentinel) this.root = y; else if (x == x.parent.right) x.parent.right = y; else x.parent.left = y; y.right = x; x.parent = y } ; js_cols.RedBlackSet.prototype.insert = function(key) { if (!this.contains(key)) { var z = new js_cols.RBnode(this); z.key = key; var y = this.sentinel; var x = this.root; while (x != this.sentinel) { y = x; if (this.compare(z.key, x.key) < 0) x = x.left; else x = x.right } z.parent = y; if (y == this.sentinel) this.root = z; else if (this.compare(z.key, y.key) < 0) y.left = z; else y.right = z; z.left = this.sentinel; z.right = this.sentinel; z.color = RED; this.insertFixup(z); this.size++ } else { var node = this.get_(key); node.key = key } } ; js_cols.RedBlackSet.prototype.insertFixup = function(z) { while (z != this.sentinel && z != this.root && z.parent.color == RED) if (z.parent == z.parent.parent.left) { var y = z.parent.parent.right; if (y.color == RED) { z.parent.color = BLACK; y.color = BLACK; z.parent.parent.color = RED; z = z.parent.parent } else { if (z == z.parent.right) { z = z.parent; this.leftRotate(z) } z.parent.color = BLACK; z.parent.parent.color = RED; if (z.parent.parent != this.sentinel) this.rightRotate(z.parent.parent) } } else { var y = z.parent.parent.left; if (y.color == RED) { z.parent.color = BLACK; y.color = BLACK; z.parent.parent.color = RED; z = z.parent.parent } else { if (z == z.parent.left) { z = z.parent; this.rightRotate(z) } z.parent.color = BLACK; z.parent.parent.color = RED; if (z.parent.parent != this.sentinel) this.leftRotate(z.parent.parent) } } this.root.color = BLACK } ; js_cols.RedBlackSet.prototype.delete_ = function(z) { var y; var x; if (z.left == this.sentinel || z.right == this.sentinel) y = z; else y = this.successor_(z); if (y.left != this.sentinel) x = y.left; else x = y.right; x.parent = y.parent; if (y.parent == this.sentinel) this.root = x; else if (y == y.parent.left) y.parent.left = x; else y.parent.right = x; if (y != z) z.key = y.key; if (y.color == BLACK) this.deleteFixup(x); this.size-- } ; js_cols.RedBlackSet.prototype.deleteFixup = function(x) { while (x != this.root && x.color == BLACK) if (x == x.parent.left) { var w = x.parent.right; if (w.color == RED) { w.color = BLACK; x.parent.color = RED; this.leftRotate(x.parent); w = x.parent.right } if (w.left.color == BLACK && w.right.color == BLACK) { w.color = RED; x = x.parent } else { if (w.right.color == BLACK) { w.left.color = BLACK; w.color = RED; this.rightRotate(w); w = x.parent.right } w.color = x.parent.color; x.parent.color = BLACK; w.right.color = BLACK; this.leftRotate(x.parent); x = this.root } } else { var w = x.parent.left; if (w.color == RED) { w.color = BLACK; x.parent.color = RED; this.rightRotate(x.parent); w = x.parent.left } if (w.right.color == BLACK && w.left.color == BLACK) { w.color = RED; x = x.parent } else { if (w.left.color == BLACK) { w.right.color = BLACK; w.color = RED; this.leftRotate(w); w = x.parent.left } w.color = x.parent.color; x.parent.color = BLACK; w.left.color = BLACK; this.rightRotate(x.parent); x = this.root } } x.color = BLACK } ; js_cols.RedBlackSet.prototype.remove = function(key) { var x = this.get_(key); if (x != this.sentinel) { var retval = x.key; this.delete_(x); return retval } else return null } ; js_cols.RedBlackSet.prototype.removeSwapped = function(value, key) { this.remove(key) } ; js_cols.RedBlackSet.prototype.min = function(x) { while (x.left != this.sentinel) x = x.left; return x } ; js_cols.RedBlackSet.prototype.max = function(x) { while (x.right != this.sentinel) x = x.right; return x } ; js_cols.RedBlackSet.prototype.successor_ = function(x) { if (x.right != this.sentinel) return this.min(x.right); var y = x.parent; while (y != this.sentinel && x == y.right) { x = y; y = y.parent } return y } ; js_cols.RedBlackSet.prototype.predeccessor_ = function(x) { if (x.left != this.sentinel) return this.max(x.left); var y = x.parent; while (y != this.sentinel && x == y.left) { x = y; y = y.parent } return y } ; js_cols.RedBlackSet.prototype.successor = function(key) { if (this.size > 0) { var x = this.get_(key); if (x == this.sentinel) return null; if (x.right != this.sentinel) return this.min(x.right).key; var y = x.parent; while (y != this.sentinel && x == y.right) { x = y; y = y.parent } if (y != this.sentinel) return y.key; else return null } else return null } ; js_cols.RedBlackSet.prototype.predecessor = function(key) { if (this.size > 0) { var x = this.get_(key); if (x == this.sentinel) return null; if (x.left != this.sentinel) return this.max(x.left).key; var y = x.parent; while (y != this.sentinel && x == y.left) { x = y; y = y.parent } if (y != this.sentinel) return y.key; else return null } else return null } ; js_cols.RedBlackSet.prototype.getMin = function() { return this.min(this.root).key } ; js_cols.RedBlackSet.prototype.getMax = function() { return this.max(this.root).key } ; js_cols.RedBlackSet.prototype.get_ = function(key) { var x = this.root; while (x != this.sentinel && this.compare(x.key, key) != 0) if (this.compare(key, x.key) < 0) x = x.left; else x = x.right; return x } ; js_cols.RedBlackSet.prototype.contains = function(key) { return this.get_(key).key != null } ; js_cols.RedBlackSet.prototype.getValues = function() { var ret = []; this.forEach(function(x) { ret.push(x) }); return ret } ; js_cols.RedBlackSet.prototype.insertAll = function(col) { if (js_cols.typeOf(col) == "array") for (var i = 0; i < col.length; i++) this.insert(col[i]); else if (js_cols.typeOf(col.forEach) == "function") col.forEach(this.insert, this); else if (js_cols.typeOf(col.getValues) == "function") { var arr = col.getValues(); for (var i = 0; i < arr.length; i++) this.insert(arr[i]) } else if (js_cols.typeOf(col) == "object") for (var key in col) this.insert(col[key]) } ; js_cols.RedBlackSet.prototype.removeAll = function(col) { if (js_cols.typeOf(col) == "array") for (var i = 0; i < col.length; i++) this.remove(col[i]); else if (js_cols.typeOf(col.forEach) == "function") col.forEach(this.removeSwapped, this); else if (js_cols.typeOf(col.getValues) == "function") { var arr = col.getValues(); for (var i = 0; i < arr.length; i++) this.remove(arr[i]) } else if (js_cols.typeOf(col) == "object") for (var key in col) this.remove(col[key]) } ; js_cols.RedBlackSet.prototype.containsAll = function(col) { if (js_cols.typeOf(col) == "array") { for (var i = 0; i < col.length; i++) if (!this.contains(col[i])) return false; return true } else if (js_cols.typeOf(col.forEach) == "function") return col.every(this.contains, this); else if (js_cols.typeOf(col.getValues) == "function") { var arr = col.getValues(); for (var i = 0; i < arr.length; i++) if (!this.contains(arr[i])) return false; return true } else if (js_cols.typeOf(col) == "object") { for (var key in col) if (!this.contains(col[key])) return false; return true } } ; js_cols.RedBlackSet.prototype.range = function(from, to) { var retArray = []; this.traverseFromTo(function(x) { retArray.push(x) }, from, to); return retArray } ; js_cols.RedBlackSet.prototype.traverse = function(f, opt_obj) { if (this.isEmpty()) return; var node = this.min(this.root); while (node != this.sentinel) { if (f.call(opt_obj, node.key, this)) return; node = this.successor_(node) } } ; js_cols.RedBlackSet.prototype.traverseFrom = function(f, fromKey, opt_obj) { if (this.isEmpty()) return; var node = this.get_(fromKey); while (node != this.sentinel) { if (f.call(opt_obj, node.key, this)) return; node = this.successor_(node) } } ; js_cols.RedBlackSet.prototype.traverseTo = function(f, toKey, opt_obj) { if (this.isEmpty()) return; var node = this.min(this.root); var toNode = this.get_(toKey); while (node != toNode) { if (f.call(opt_obj, node.key, this)) return; node = this.successor_(node) } } ; js_cols.RedBlackSet.prototype.traverseFromTo = function(f, fromKey, toKey, opt_obj) { if (this.isEmpty()) return; var node = this.get_(fromKey); var toNode = this.get_(toKey); while (node != toNode) { if (f.call(opt_obj, node.key, this)) return; node = this.successor_(node) } } ; js_cols.RedBlackSet.prototype.traverseBackwards = function(f, opt_obj) { if (this.isEmpty()) return; var node = this.max(this.root); while (node != this.sentinel) { if (f.call(opt_obj, node.key, this)) return; node = this.predeccessor_(node) } } ; js_cols.RedBlackSet.prototype.forEach = function(f, opt_obj) { if (this.isEmpty()) return; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) f.call(opt_obj, n.key, n.key, this) } ; js_cols.RedBlackSet.prototype.some = function(f, opt_obj) { if (this.isEmpty()) return false; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) if (f.call(opt_obj, n.key, n.key, this)) return true; return false } ; js_cols.RedBlackSet.prototype.every = function(f, opt_obj) { if (this.isEmpty()) return false; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) if (!f.call(opt_obj, n.key, n.key, this)) return false; return true } ; js_cols.RedBlackSet.prototype.map = function(f, opt_obj) { var rv = []; if (this.isEmpty()) return rv; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) rv.push(f.call(opt_obj, n.key, n.key, this)); return rv } ; js_cols.RedBlackSet.prototype.filter = function(f, opt_obj) { var rv = []; if (this.isEmpty()) return rv; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) if (f.call(opt_obj, n.key, n.key, this)) rv.push(n.key); return rv } ; js_cols.RedBlackSet.prototype.getCount = function() { return this.size } ; js_cols.RedBlackSet.prototype.isEmpty = function() { return this.size == 0 } ; js_cols.RedBlackSet.prototype.isSubsetOf = function(col) { var colCount = js_cols.getCount(col); if (this.getCount() > colCount) return false; var i = 0; if (this.isEmpty()) return true; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) if (js_cols.contains.call(col, col, n.key)) i++; return i == this.getCount() } ; js_cols.RedBlackSet.prototype.intersection = function(col) { var result = new js_cols.RedBlackSet(this.compare); if (this.isEmpty()) return result; for (var n = this.min(this.root); n != this.sentinel; n = this.successor_(n)) if (col.contains.call(col, n.key, n.key, this)) result.insert(n.key); return result } ; C3.RedBlackSet = class RedBlackSet extends C3.DefendedBase { constructor(sortFunc) { super(); this._rbSet = new js_cols.RedBlackSet(sortFunc); this._enableQueue = false; this._queueInsert = new Set; this._queueRemove = new Set } Add(item) { if (this._enableQueue) if (this._rbSet.contains(item)) this._queueRemove.delete(item); else this._queueInsert.add(item); else this._rbSet.insert(item) } Remove(item) { if (this._enableQueue) if (this._rbSet.contains(item)) this._queueRemove.add(item); else this._queueInsert.delete(item); else this._rbSet.remove(item) } Has(item) { if (this._enableQueue) { if (this._queueInsert.has(item)) return true; return !this._queueRemove.has(item) && this._rbSet.contains(item) } else return this._rbSet.contains(item) } Clear() { this._rbSet.clear(); this._queueInsert.clear(); this._queueRemove.clear() } toArray() { if (this._enableQueue) throw new Error("cannot be used in queueing mode"); return this._rbSet.getValues() } GetSize() { return this._rbSet.getCount() + this._queueInsert.size - this._queueRemove.size } IsEmpty() { return this.GetSize() === 0 } Front() { if (this.IsEmpty()) throw new Error("empty set"); if (this._enableQueue) throw new Error("cannot be used in queueing mode"); const rbSet = this._rbSet; const n = rbSet.min(rbSet.root); return n.key } Shift() { if (this.IsEmpty()) throw new Error("empty set"); if (this._enableQueue) throw new Error("cannot be used in queueing mode"); const item = this.Front(); this.Remove(item); return item } SetQueueingEnabled(q) { q = !!q; if (this._enableQueue === q) return; this._enableQueue = q; if (!q) { for (const item of this._queueRemove) this._rbSet.remove(item); this._queueRemove.clear(); for (const item of this._queueInsert) this._rbSet.insert(item); this._queueInsert.clear() } } ForEach(func) { this._rbSet.forEach(func) } *values() { if (this.IsEmpty()) return; const rbSet = this._rbSet; for (let n = rbSet.min(rbSet.root); n != rbSet.sentinel; n = rbSet.successor_(n)) yield n.key } [Symbol.iterator]() { return this.values() } } } ;'use strict'; { const C3 = self.C3; C3.PromiseThrottle = class PromiseThrottle { constructor(maxParallel=C3.hardwareConcurrency) { this._maxParallel = maxParallel; this._queue = []; this._activeCount = 0 } Add(func) { return new Promise((resolve,reject)=>{ this._queue.push({ func, resolve, reject }); this._MaybeStartNext() } ) } _FindInQueue(func) { for (let i = 0, len = this._queue.length; i < len; ++i) if (this._queue[i].func === func) return i; return -1 } RemoveAndResolve(func, value) { const i = this._FindInQueue(func); if (i === -1) throw new Error("cannot find promise to resolve"); this._queue[i].resolve(value); this._queue.splice(i, 1) } RemoveAndReject(func, value) { const i = this._FindInQueue(func); if (i === -1) throw new Error("cannot find promise to reject"); this._queue[i].reject(value); this._queue.splice(i, 1) } async _MaybeStartNext() { if (!this._queue.length) return; if (this._activeCount >= this._maxParallel) return; this._activeCount++; const job = this._queue.shift(); try { const result = await job.func(); job.resolve(result) } catch (err) { job.reject(err) } this._activeCount--; this._MaybeStartNext() } static async Batch(concurrency, methods) { const results = []; let failed = false; const execute = async _=>{ let fn; while (fn = methods.pop()) { if (failed) return; try { results.push(await fn()) } catch (e) { failed = true; throw e; } } } ; const promises = []; while (concurrency--) promises.push(execute()); await Promise.all(promises); return results } } } ;'use strict'; { const C3 = self.C3; C3.RateLimiter = class RateLimiter { constructor(callback, interval, intervalOnBattery) { this._callback = callback; this._interval = interval; this._intervalOnBattery = intervalOnBattery || interval * 2; this._timerId = -1; this._lastCallTime = -Infinity; this._timerCallFunc = ()=>this._OnTimer(); this._ignoreReset = false; this._canRunImmediate = false; this._callbackArguments = null } SetCanRunImmediate(c) { this._canRunImmediate = !!c } _GetInterval() { if (typeof C3.Battery !== "undefined" && C3.Battery.IsOnBatteryPower()) return this._intervalOnBattery; else return this._interval } Call(...args) { if (this._timerId !== -1) return; this._callbackArguments = args; let nowTime = C3.FastGetDateNow(); let timeSinceLastCall = nowTime - this._lastCallTime; let interval = this._GetInterval(); if (timeSinceLastCall >= interval && this._canRunImmediate) { this._lastCallTime = nowTime; this._RunCallback() } else this._timerId = self.setTimeout(this._timerCallFunc, Math.max(interval - timeSinceLastCall, 4)) } _RunCallback() { this._ignoreReset = true; const args = this._callbackArguments; this._callbackArguments = null; if (args) this._callback(...args); else this._callback(); this._ignoreReset = false } Reset() { if (this._ignoreReset) return; this._CancelTimer(); this._callbackArguments = null; this._lastCallTime = C3.FastGetDateNow() } _OnTimer() { this._timerId = -1; this._lastCallTime = C3.FastGetDateNow(); this._RunCallback() } _CancelTimer() { if (this._timerId !== -1) { self.clearTimeout(this._timerId); this._timerId = -1 } } Release() { this._CancelTimer(); this._callback = null; this._callbackArguments = null; this._timerCallFunc = null } } } ;'use strict'; { const C3 = self.C3; C3.SVGRasterManager = class SVGRasterManager { constructor() { this._images = new Map; this._allowNpotSurfaces = false; this._getBaseSizeCallback = null; this._rasterAtSizeCallback = null; this._releaseResultCallback = null; this._redrawCallback = null } SetNpotSurfaceAllowed(a) { this._allowNpotSurfaces = !!a } IsNpotSurfaceAllowed() { return this._allowNpotSurfaces } SetGetBaseSizeCallback(f) { this._getBaseSizeCallback = f } GetBaseSize(dataSource) { if (!this._getBaseSizeCallback) throw new Error("no get base size callback set"); return this._getBaseSizeCallback(dataSource) } SetRasterAtSizeCallback(f) { this._rasterAtSizeCallback = f } RasterAtSize(dataSource, context, surfaceWidth, surfaceHeight, imageWidth, imageHeight) { if (!this._rasterAtSizeCallback) throw new Error("no raster at size callback set"); return this._rasterAtSizeCallback(dataSource, context, surfaceWidth, surfaceHeight, imageWidth, imageHeight) } SetReleaseResultCallback(f) { this._releaseResultCallback = f } ReleaseResult(rasterizedResult) { if (!this._releaseResultCallback) throw new Error("no release result callback set"); this._releaseResultCallback(rasterizedResult) } SetRedrawCallback(f) { this._redrawCallback = f } Redraw() { if (!this._redrawCallback) throw new Error("no redraw callback set"); this._redrawCallback() } AddImage(dataSource) { let ret = this._images.get(dataSource); if (!ret) { ret = C3.New(C3.SVGRasterImage, this, dataSource); this._images.set(dataSource, ret) } ret.IncReference(); return ret } _RemoveImage(ri) { this._images.delete(ri.GetDataSource()) } } } ;'use strict'; { const C3 = self.C3; const MAX_SURFACE_SIZE = 2048; C3.SVGRasterImage = class SVGRasterImage { constructor(manager, dataSource) { this._manager = manager; this._dataSource = dataSource; this._refCount = 0; this._baseWidth = 0; this._baseHeight = 0; this._getBaseSizePromise = this._manager.GetBaseSize(dataSource).then(baseSize=>{ this._baseWidth = baseSize[0]; this._baseHeight = baseSize[1]; this._manager.Redraw() } ).catch(err=>{ console.error("[SVG] Error loading SVG: ", err); this._hadError = true; this._manager.Redraw() } ); this._rasterSurfaceWidth = 0; this._rasterSurfaceHeight = 0; this._rasterImageWidth = 0; this._rasterImageHeight = 0; this._isRasterizing = false; this._rasterizedResult = null; this._forceRaster = false; this._hadError = false } Release() { if (this._refCount <= 0) throw new Error("already released"); this._refCount--; if (this._refCount === 0) this._Release() } _Release() { if (this._rasterizedResult) { this._manager.ReleaseResult(this._rasterizedResult); this._rasterizedResult = null } this._manager._RemoveImage(this); this._manager = null } GetDataSource() { return this._dataSource } IncReference() { this._refCount++ } HasReferences() { return this._refCount > 0 } GetRasterizedResult() { return this._rasterizedResult } ForceRasterAgain() { this._forceRaster = true } async StartRasterForSize(context, width, height) { if (width === 0 || height === 0 || this._hadError) return; if (this._isRasterizing) return; let rasterSurfaceWidth = C3.nextHighestPowerOfTwo(Math.ceil(width)); let rasterSurfaceHeight = C3.nextHighestPowerOfTwo(Math.ceil(height)); const maxDim = Math.max(rasterSurfaceWidth, rasterSurfaceHeight); if (maxDim > MAX_SURFACE_SIZE) { const scale = MAX_SURFACE_SIZE / maxDim; width *= scale; height *= scale; rasterSurfaceWidth = Math.min(Math.ceil(rasterSurfaceWidth * scale), MAX_SURFACE_SIZE); rasterSurfaceHeight = Math.min(Math.ceil(rasterSurfaceHeight * scale), MAX_SURFACE_SIZE) } if (width < rasterSurfaceWidth && height < rasterSurfaceHeight) { const imageAspectRatio = width / height; const surfaceAspectRatio = rasterSurfaceWidth / rasterSurfaceHeight; if (surfaceAspectRatio > imageAspectRatio) { width = rasterSurfaceHeight * imageAspectRatio; height = rasterSurfaceHeight } else { width = rasterSurfaceWidth; height = rasterSurfaceWidth / imageAspectRatio } } if (this._manager.IsNpotSurfaceAllowed()) { rasterSurfaceWidth = Math.ceil(width); rasterSurfaceHeight = Math.ceil(height) } if (rasterSurfaceWidth <= this._rasterSurfaceWidth && rasterSurfaceHeight <= this._rasterSurfaceHeight && !this._forceRaster) return; this._isRasterizing = true; this._rasterSurfaceWidth = rasterSurfaceWidth; this._rasterSurfaceHeight = rasterSurfaceHeight; const newRasterizedResult = await this._manager.RasterAtSize(this._dataSource, context, this._rasterSurfaceWidth, this._rasterSurfaceHeight, width, height); if (this._rasterizedResult) this._manager.ReleaseResult(this._rasterizedResult); this._rasterizedResult = newRasterizedResult; this._rasterImageWidth = width; this._rasterImageHeight = height; this._isRasterizing = false; this._forceRaster = false; this._manager.Redraw() } WhenBaseSizeReady() { return this._getBaseSizePromise } GetBaseWidth() { return this._baseWidth } GetBaseHeight() { return this._baseHeight } GetRasterWidth() { return this._rasterImageWidth } GetRasterHeight() { return this._rasterImageHeight } HadError() { return this._hadError } } } ;'use strict'; { const C3 = self.C3; C3.UTF8_BOM = "\ufeff"; const NUMERIC_CHARS = new Set([..."0123456789"]); C3.IsNumericChar = function IsNumericChar(c) { return NUMERIC_CHARS.has(c) } ; const WHITESPACE_CHARS = new Set([..." \t\n\r\u00a0\u0085\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f\u205f\u3000"]); C3.IsWhitespaceChar = function IsWhitespaceChar(c) { return WHITESPACE_CHARS.has(c) } ; C3.FilterWhitespace = function FilterWhitespace(str) { return [...str].filter(ch=>!C3.IsWhitespaceChar(ch)).join("") } ; C3.IsStringAllWhitespace = function IsStringAllWhitespace(str) { for (const ch of str) if (!C3.IsWhitespaceChar(ch)) return false; return true } ; C3.IsUnprintableChar = function IsUnprintableChar(c) { return c.length === 1 && c.charCodeAt(0) < 32 } ; C3.FilterUnprintableChars = function FilterUnprintableChars(str) { return [...str].filter(ch=>!C3.IsUnprintableChar(ch)).join("") } ; const NUMERIC_STRING_CHARS = new Set([..."0123456789.+-e"]); C3.IsStringNumber = function IsStringNumber(str) { str = str.trim(); if (!str.length) return false; let firstChar = str.charAt(0); if (firstChar !== "-" && !NUMERIC_CHARS.has(firstChar)) return false; for (let ch of str) if (!NUMERIC_STRING_CHARS.has(ch)) return false; return true } ; C3.RemoveTrailingDigits = function RemoveTrailingDigits(str) { let i = str.length; while (i > 0) { let prev_ch = str.charAt(i - 1); if (!C3.IsNumericChar(prev_ch)) break; --i } return str.substr(0, i) } ; C3.IncrementNumberAtEndOf = function IncrementNumberAtEndOf(str) { let baseStr = C3.RemoveTrailingDigits(str); let numberStr = str.substr(baseStr.length); if (numberStr) numberStr = (parseInt(numberStr, 10) + 1).toString(); else numberStr = "2"; return baseStr + numberStr } ; const HTML_ENTITY_MAP = new Map([["&", "&"], ["<", "<"], [">", ">"], ['"', """], ["'", "'"]]); function lookupHtmlEntity(s) { return HTML_ENTITY_MAP.get(s) } const HTML_ENTITY_REGEX = /[&<>"']/g; C3.EscapeHTML = function EscapeHTML(str) { return str.replace(HTML_ENTITY_REGEX, lookupHtmlEntity) } ; C3.EscapeJS = function EscapeJS(str) { let ret = C3.ReplaceAll(str, "\\", "\\\\"); ret = C3.ReplaceAll(ret, '"', '\\"'); ret = C3.ReplaceAll(ret, "\t", "\\t"); ret = C3.ReplaceAll(ret, "\r", ""); return C3.ReplaceAll(ret, "\n", "\\n") } ; C3.EscapeXML = function EscapeXML(str) { let ret = C3.ReplaceAll(str, "&", "&"); ret = C3.ReplaceAll(ret, "<", "<"); ret = C3.ReplaceAll(ret, ">", ">"); return C3.ReplaceAll(ret, '"', """) } ; const ESCAPE_REGEX = /[-[\]{}()*+?.,\\^$|#\s]/g; C3.EscapeRegex = function EscapeRegex(str) { return str.replace(ESCAPE_REGEX, "\\$&") } ; C3.FindAll = function FindAll(str, find, matchCase=false) { if (!find) return []; if (!matchCase) { str = str.toLowerCase(); find = find.toLowerCase() } const findLen = find.length; let startIndex = 0; let index = 0; let ret = []; while ((index = str.indexOf(find, startIndex)) > -1) { ret.push(index); startIndex = index + findLen } return ret } ; C3.ReplaceAll = function ReplaceAll(str, find, replace) { return str.replaceAll(find, ()=>replace) } ; C3.ReplaceAllCaseInsensitive = function ReplaceAll(str, find, replace) { return str.replace(new RegExp(C3.EscapeRegex(find),"gi"), ()=>replace) } ; C3.SetElementContent = function SetElementContent(elem, stringlike) { if (typeof stringlike === "string") elem.textContent = stringlike; else if (stringlike.isPlainText()) elem.textContent = stringlike.toString(); else { elem.innerHTML = stringlike.toHTML(); if (stringlike instanceof C3.BBString) stringlike.attachLinkHandlers(elem) } } ; C3.StringLikeEquals = function StringLikeEquals(a, b) { if (a instanceof C3.HtmlString || a instanceof C3.BBString) return a.equals(b); else if (b instanceof C3.HtmlString || b instanceof C3.BBString) return b.equals(a); else return a === b } ; C3.StringSubstitute = function StringSubstitute(str, ...arr) { let ret = str; for (let i = 0, len = arr.length; i < len; ++i) { const sub = `{${i}}`; if (!str.includes(sub)) throw new Error(`missing placeholder '${sub}' in string substitution`); ret = ret.replace(sub, arr[i].toString()) } return ret } ; C3.StringSubstituteAllowMissing = function StringSubstituteAllowMissing(str, ...arr) { let ret = str; let lowestMissingIndex = -1; let highestUsedIndex = -1; for (let i = 0, len = arr.length; i < len; ++i) { const sub = `{${i}}`; if (str.includes(sub)) { highestUsedIndex = i; ret = ret.replace(sub, arr[i].toString()) } else if (lowestMissingIndex === -1) lowestMissingIndex = i } if (lowestMissingIndex >= 0 && highestUsedIndex >= 0 && lowestMissingIndex < highestUsedIndex) throw new Error(`missing placeholder '${lowestMissingIndex}' in string substitution`); return ret } ; C3.StringSubstituteMap = function StringSubstituteMap(str, o) { let ret = str; for (let[placeholder,substitution] of Object.entries(o)) ret = ret.replaceAll(placeholder, substitution.toString()); return ret } ; C3.SortAZCaseInsensitive = function SortAZCaseInsensitive(a, b) { let lowerA = a.toLowerCase(); let lowerB = b.toLowerCase(); if (lowerA > lowerB) return 1; else if (lowerA < lowerB) return -1; else return 0 } ; const KILOBYTE = 1024; const MEGABYTE = KILOBYTE * 1024; const GIGABYTE = MEGABYTE * 1024; const TERABYTE = GIGABYTE * 1024; C3.FormatDataSize = function FormatDataSize(sizeInBytes, asRate) { let rootKey = "common." + (asRate ? "dataRates" : "dataSizes") + "."; const langSub = self.langSub; if (sizeInBytes < KILOBYTE) return langSub(rootKey + "bytes", sizeInBytes); else if (sizeInBytes < MEGABYTE) { let kb = sizeInBytes / KILOBYTE; if (kb < 10) kb = Math.round(kb * 10) / 10; else kb = Math.round(kb); return langSub(rootKey + "kilobytes", kb) } else if (sizeInBytes < GIGABYTE) { let mb = sizeInBytes / MEGABYTE; if (mb < 10) mb = Math.round(mb * 10) / 10; else mb = Math.round(mb); return langSub(rootKey + "megabytes", mb) } else if (sizeInBytes < TERABYTE) { let gb = sizeInBytes / GIGABYTE; if (gb < 10) gb = Math.round(gb * 10) / 10; else gb = Math.round(gb); return langSub(rootKey + "gigabytes", gb) } else { let tb = sizeInBytes / TERABYTE; if (tb < 10) tb = Math.round(tb * 10) / 10; else tb = Math.round(tb); return langSub(rootKey + "terabytes", tb) } } ; const DEFAULT_FORMATTIME_OPTS = { approximate: false, days: true, hours: true, minutes: true, seconds: true }; C3.FormatTime = function FormatTime(secondsTotal, opts) { opts = Object.assign({}, DEFAULT_FORMATTIME_OPTS, opts); C3.Lang.PushContext("common.time"); const parts = []; const lang = self.lang; const langPluralSub = self.langPluralSub; if (opts.days) { const days = Math.floor(secondsTotal / (24 * 3600)); if (days > 0) { secondsTotal -= days * 24 * 3600; parts.push(langPluralSub(".days", null, days)) } } if (opts.hours) { const hours = Math.floor(secondsTotal / 3600); if (hours > 0 || parts.length) { secondsTotal -= hours * 3600; parts.push(langPluralSub(".hours", null, hours)) } } if (opts.minutes) { const minutes = Math.floor(secondsTotal / 60); if (minutes > 0 || parts.length || !opts.seconds) { secondsTotal -= minutes * 60; parts.push(langPluralSub(".minutes", null, minutes)) } } if (opts.seconds) { const seconds = Math.floor(secondsTotal % 60); parts.push(langPluralSub(".seconds", null, seconds)) } const ret = (opts.approximate ? lang(".approx-prefix") : "") + parts.join(lang(".separator")); C3.Lang.PopContext(); return ret } ; C3.ZeroPad = function(n, d) { let s = n < 0 ? "-" : ""; n = Math.abs(n); let nStr = n.toString(); let zeroes = d - nStr.length; for (let i = 0; i < zeroes; ++i) s += "0"; return s + nStr } ; C3.StringToTitleCase = function StringToTitleCase(str) { return str.toLowerCase().replace(/\b\w/g, t=>t.toUpperCase()) } ; C3.CompareVersionStrings = function CompareVersionStrings(v1, v2) { let a1 = v1.split(".").map(s=>s.trim()); let a2 = v2.split(".").map(s=>s.trim()); C3.resizeArray(a1, 4, "0"); C3.resizeArray(a2, 4, "0"); a1 = a1.map(s=>parseInt(s, 10)); a2 = a2.map(s=>parseInt(s, 10)); for (let i = 0; i < 4; ++i) { const diff = a1[i] - a2[i]; if (diff !== 0) return diff < 0 ? -1 : 1 } return 0 } ; C3.CreateGUID = function CreateGUID() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c=>{ const r = Math.floor(Math.random() * 16); const v = c === "x" ? r : r & 3 | 8; return v.toString(16) } ) } ; C3.StringHammingDistance = function StringHammingDistance(a, b) { if (a.length !== b.length) throw new Error("strings must be same length"); let ret = 0; for (let i = 0, len = a.length; i < len; ++i) if (a.charAt(i) !== b.charAt(i)) ++ret; return ret } ; C3.StringLevenshteinDistance = function StringLevenshteinDistance(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; let tmp, i, j, prev, val, row; if (a.length > b.length) { tmp = a; a = b; b = tmp } row = Array(a.length + 1); for (i = 0; i <= a.length; i++) row[i] = i; for (i = 1; i <= b.length; i++) { prev = i; for (j = 1; j <= a.length; j++) { if (b[i - 1] === a[j - 1]) val = row[j - 1]; else val = Math.min(row[j - 1] + 1, Math.min(prev + 1, row[j] + 1)); row[j - 1] = prev; prev = val } row[a.length] = prev } return row[a.length] } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; const BB_CODE_MAP = new Map([["b", "strong"], ["i", "em"], ["s", "s"], ["u", "u"], ["sub", "sub"], ["sup", "sup"], ["small", "small"], ["mark", "mark"], ["a1", "a"], ["a2", "a"], ["a3", "a"], ["a4", "a"], ["a5", "a"], ["a6", "a"], ["a7", "a"], ["a8", "a"], ["a9", "a"], ["bad", ["span", "bbCodeBad"]], ["good", ["span", "bbCodeGood"]], ["info", ["span", "bbCodeInfo"]], ["h1", ["span", "bbCodeH1"]], ["h2", ["span", "bbCodeH2"]], ["h3", ["span", "bbCodeH3"]], ["h4", ["span", "bbCodeH4"]], ["item", ["span", "bbCodeItem"]]]); const BBREGEX = /\[(\/?)([a-zA-Z0-9]+)\]/g; const CUSTOM_BBREGEX = /\[(\/?)([^\[]*?)\]/g; let linkActions = null; let classIndex = 0; function bbToHtmlReplacerFunc(match, closeSlash, tagName) { const entry = BB_CODE_MAP.get(tagName); if (entry) if (typeof entry === "string") if (entry === "a" && !closeSlash) { const index = parseInt(tagName.substring(1), 10) - 1; if (index < 0 || index >= linkActions.length) throw new Error("invalid bbcode link substitution"); const linkAction = linkActions[index]; if (typeof linkAction === "string") return ``; else if (typeof linkAction === "function") return ``; else throw new TypeError("invalid bbcode link action"); } else return "<" + closeSlash + entry + ">"; else if (Array.isArray(entry)) { let tag = entry[0]; let className = entry[1]; if (closeSlash) return ""; else return `<${tag} class="${className}">` } else ; else if (tagName === "class") if (closeSlash) return ""; else return ``; else return match } const LINEBREAK_REGEX = /\n/g; C3.BBString = class BBString { constructor(str, opts) { this._bbstr = opts && opts.noEscape ? str : C3.EscapeHTML(str); this._htmlstr = ""; this._convertLineBreaks = false; this._linkActions = []; if (opts) { this._convertLineBreaks = !!opts.convertLineBreaks; if (opts.links) { if (opts.links.length > 9) throw new Error("too many links"); this._linkActions = opts.links } } this._hasAnyBBtags = this._bbstr.includes("["); this._needsLineBreakConversion = this._convertLineBreaks && this._bbstr.includes("\n"); this._isPlain = !this._hasAnyBBtags && !this._needsLineBreakConversion && !this._bbstr.includes("&"); this._hasParsedFragments = false; this._fragments = [] } toString() { return this._bbstr } valueOf() { return this._bbstr } isPlainText() { return this._isPlain } toPlainText() { if (this._hasAnyBBtags) return this._bbstr.replace(BBREGEX, ""); else return this._bbstr } toHTML() { if (this._isPlain) return this._bbstr; if (!this._htmlstr && this._bbstr) { let str = this._bbstr; if (this._hasAnyBBtags) { classIndex = 0; linkActions = this._linkActions; str = str.replace(BBREGEX, bbToHtmlReplacerFunc); linkActions = null } if (this._needsLineBreakConversion) str = str.replace(LINEBREAK_REGEX, "
"); this._htmlstr = str } return this._htmlstr } attachLinkHandlers(parentElem) { if (!this._linkActions.length) return; for (let i = 0, len = this._linkActions.length; i < len; ++i) { const linkAction = this._linkActions[i]; if (typeof linkAction !== "function") continue; const linkElem = parentElem.querySelector(".bblink" + i); if (!linkElem) throw new Error("unable to attach BBString link handler"); linkElem.onclick = linkAction } } equals(s) { if (s instanceof C3.HtmlString) return this.toHTML() === s.toHTML(); else if (s instanceof C3.BBString) return this._bbstr === s._bbstr; else return this._bbstr === s } toFragmentList() { if (this._hasParsedFragments) return this._fragments; const bbStr = this._bbstr; const styleStack = []; CUSTOM_BBREGEX.lastIndex = 0; let prevIndex = 0; let result = null; while ((result = CUSTOM_BBREGEX.exec(bbStr)) !== null) { const index = result.index; if (index > 0 && bbStr.charAt(index - 1) === "\\") continue; const matchStr = result[0]; const closeSlash = result[1]; const tagName = result[2]; const strFrag = bbStr.substring(prevIndex, index); prevIndex = index + matchStr.length; if (strFrag) this._fragments.push({ text: strFrag, styles: styleStack.slice(0) }); if (!tagName) continue; if (closeSlash) { const lowerTagName = tagName.toLowerCase(); for (let i = styleStack.length - 1; i >= 0; --i) if (styleStack[i].tag === lowerTagName) { styleStack.splice(i, 1); break } } else { let tag = tagName; let param = null; const eq = tagName.indexOf("="); if (eq !== -1) { tag = tagName.substring(0, eq).toLowerCase(); param = tagName.substring(eq + 1) } else tag = tag.toLowerCase(); styleStack.push({ tag, param }) } } if (prevIndex < bbStr.length) this._fragments.push({ text: bbStr.substring(prevIndex), styles: styleStack.slice(0) }); for (const frag of this._fragments) frag.text = this._ProcessBBCodeEscapeSequences(frag.text); this._hasParsedFragments = true; return this._fragments } _ProcessBBCodeEscapeSequences(text) { text = C3.ReplaceAll(text, "\\[", "["); return C3.ReplaceAll(text, "\\\\", "\\") } static StripTags(str) { return C3.New(C3.BBString, str, { noEscape: true }).toPlainText() } static StripAnyTags(str) { return str.replace(CUSTOM_BBREGEX, "") } } } ;'use strict'; { const C3 = self.C3; C3.WordWrap = class WordWrap { constructor() { this._lines = [] } GetLines() { return this._lines } GetLineCount() { return this._lines.length } _MeasureLine(line, measureFunc) { let width = 0; let height = 0; for (const frag of line) { if (frag.width === -1) { const m = measureFunc(frag.text, frag.styles); frag.width = m.width; frag.height = m.height } width += frag.width; height = Math.max(height, frag.height) } return { width, height } } _AddLine(fragments, width, height) { this._lines.push({ fragments, width, height }) } WordWrap(fragmentArr, measureFunc, wrapWidth, wrapMode, endOfLineMargin) { if (typeof fragmentArr === "string") fragmentArr = [{ text: fragmentArr, styles: [] }]; C3.clearArray(this._lines); if (!fragmentArr.length || fragmentArr.length === 1 && !fragmentArr[0].text.length || wrapWidth < 2) return; if (fragmentArr.length === 1) { const frag = fragmentArr[0]; const text = frag.text; const styles = frag.styles; if (text.length <= 100 && !text.includes("\n")) { let {width, height} = measureFunc(text, styles); width += endOfLineMargin; if (width <= wrapWidth) { this._AddLine([{ text, styles, width, height }], width, height); return } } } let tokenisedFragments; if (wrapMode === "word") tokenisedFragments = this._TokeniseWords(fragmentArr); else { tokenisedFragments = []; for (const frag of fragmentArr) C3.appendArray(tokenisedFragments, [...frag.text].map(ch=>[{ text: ch, styles: frag.styles }])) } this._WrapText(tokenisedFragments, measureFunc, wrapWidth, endOfLineMargin) } _TokeniseWords(fragmentArr) { const ret = []; let curWord = []; let isCurWhitespace = false; for (const frag of fragmentArr) { const text = frag.text; const styles = frag.styles; for (const ch of text) if (ch === "\n") { if (curWord.length > 0) ret.push(curWord); ret.push([{ text: "\n", styles }]); curWord = [] } else if (curWord.length === 0) { curWord.push({ text: ch, styles }); isCurWhitespace = C3.IsWhitespaceChar(ch) } else { const isWhitespace = C3.IsWhitespaceChar(ch); if (isWhitespace === isCurWhitespace) { const curFrag = curWord[curWord.length - 1]; if (curFrag.styles === styles) curFrag.text += ch; else curWord.push({ text: ch, styles }) } else { ret.push(curWord); curWord = []; curWord.push({ text: ch, styles }); isCurWhitespace = isWhitespace } } } if (curWord.length > 0) ret.push(curWord); return ret } _CopyLine(line) { return line.map(f=>({ text: f.text, styles: f.styles, width: f.width, height: f.height })) } _AddWordToLine(currentLine, curWord) { const lastFrag = currentLine.length ? currentLine[currentLine.length - 1] : null; let i = 0; if (lastFrag && curWord[0].styles === lastFrag.styles) { lastFrag.text += curWord[0].text; lastFrag.width = -1; lastFrag.height = -1; i = 1 } for (let len = curWord.length; i < len; ++i) { const f = curWord[i]; currentLine.push({ text: f.text, styles: f.styles, width: -1, height: -1 }) } } _WrapText(tokenisedFragments, measureFunc, wrapWidth, endOfLineMargin) { let currentLine = []; let currentLineWidth = 0; let currentLineHeight = 0; for (const curWord of tokenisedFragments) { if (curWord.length === 1 && curWord[0].text === "\n") { if (currentLineHeight === 0) currentLineHeight = measureFunc(" ", curWord[0].styles).height; this._AddLine(currentLine, currentLineWidth, currentLineHeight); currentLine = []; currentLineWidth = 0; currentLineHeight = 0; continue } const tryLine = this._CopyLine(currentLine); this._AddWordToLine(tryLine, curWord); const tryMetrics = this._MeasureLine(tryLine, measureFunc); const tryLineWidth = tryMetrics.width; const tryLineHeight = tryMetrics.height; if (tryLineWidth >= wrapWidth) { if (currentLine.length > 0) this._AddLine(currentLine, currentLineWidth, currentLineHeight); currentLine = []; if (C3.IsStringAllWhitespace(curWord[0].text)) { currentLineWidth = 0; currentLineHeight = 0 } else { this._AddWordToLine(currentLine, curWord); const metrics = this._MeasureLine(currentLine, measureFunc); currentLineWidth = metrics.width; currentLineHeight = metrics.height } } else { currentLine = tryLine; currentLineWidth = tryLineWidth; currentLineHeight = tryLineHeight } } if (currentLine.length > 0) this._AddLine(currentLine, currentLineWidth, currentLineHeight); this._TrimLinesTrailingWhitespace(measureFunc, endOfLineMargin) } _TrimLinesTrailingWhitespace(measureFunc, endOfLineMargin) { for (const line of this._lines) { const fragments = line.fragments; if (!fragments.length) continue; let lastFrag = fragments[fragments.length - 1]; const text = lastFrag.text; const trimmedText = text.trimEnd(); if (!trimmedText) { line.width -= lastFrag.width; fragments.pop() } else if (trimmedText.length < text.length) { const trimmedWidth = measureFunc(trimmedText, lastFrag.styles).width; const diff = lastFrag.width - trimmedWidth; lastFrag.width = trimmedWidth; lastFrag.text = trimmedText; line.width -= diff } if (endOfLineMargin !== 0 && fragments.length > 0) { lastFrag = fragments[fragments.length - 1]; lastFrag.width += endOfLineMargin; line.width += endOfLineMargin } } } Clear() { C3.clearArray(this._lines) } GetMaxLineWidth() { return this._lines.reduce((a,v)=>Math.max(a, v.width), 0) } GetTotalLineHeight() { return this._lines.reduce((a,v)=>a + v.height, 0) } } } ;'use strict'; self.C3.Gfx = {}; 'use strict'; { const C3 = self.C3; const PERSPECTIVE_NEAR_Z = 1; const PERSPECTIVE_FAR_Z = 1E4; const fTempo = [0, 0, 0, 0, 0, 0, 0, 0]; const glMatrix = self.glMatrix; const vec3 = glMatrix.vec3; const mat4 = glMatrix.mat4; const tmpVec3 = vec3.fromValues(0, 0, 0); C3.Gfx.RendererBase = class RendererBase { constructor() { this._width = 0; this._height = 0; this._cam = vec3.fromValues(0, 0, 100); this._look = vec3.fromValues(0, 0, 0); this._up = vec3.fromValues(0, 1, 0); this._worldScale = vec3.fromValues(1, 1, 1); this._matP = mat4.create(); this._matMV = mat4.create(); this._lastMV = mat4.create(); this._allShaderPrograms = []; this._shaderProgramsByName = new Map; this._spTextureFill = null; this._stateGroups = new Map; this._currentStateGroup = null; this._blendModeTable = []; this._namedBlendModeMap = new Map; this._frameNumber = 0; this._enableMipmaps = true } FillIndexBufferData(indexData) { let i = 0 , len = indexData.length , fv = 0; while (i < len) { indexData[i++] = fv; indexData[i++] = fv + 1; indexData[i++] = fv + 2; indexData[i++] = fv; indexData[i++] = fv + 2; indexData[i++] = fv + 3; fv += 4 } } Project(x, y, w, h, out) { const mv = this._matMV; const proj = this._matP; for (let i = 0, len = fTempo.length; i < len; ++i) fTempo[i] = 0; fTempo[0] = mv[0] * x + mv[4] * y + mv[12]; fTempo[1] = mv[1] * x + mv[5] * y + mv[13]; fTempo[2] = mv[2] * x + mv[6] * y + mv[14]; fTempo[3] = mv[3] * x + mv[7] * y + mv[15]; fTempo[4] = proj[0] * fTempo[0] + proj[4] * fTempo[1] + proj[8] * fTempo[2] + proj[12] * fTempo[3]; fTempo[5] = proj[1] * fTempo[0] + proj[5] * fTempo[1] + proj[9] * fTempo[2] + proj[13] * fTempo[3]; fTempo[6] = proj[2] * fTempo[0] + proj[6] * fTempo[1] + proj[10] * fTempo[2] + proj[14] * fTempo[3]; fTempo[7] = -fTempo[2]; if (fTempo[7] === 0) return; fTempo[7] = 1 / fTempo[7]; fTempo[4] *= fTempo[7]; fTempo[5] *= fTempo[7]; fTempo[6] *= fTempo[7]; out[0] = (fTempo[4] * .5 + .5) * w; out[1] = (fTempo[5] * .5 + .5) * h } GetWidth() { return this._width } GetHeight() { return this._height } GetNearZ() { return PERSPECTIVE_NEAR_Z } GetFarZ() { return PERSPECTIVE_FAR_Z } SetCameraXYZ(x, y, z) { this._cam[0] = x * this._worldScale[0]; this._cam[1] = y * this._worldScale[1]; this._cam[2] = z } SetLookXYZ(x, y, z) { this._look[0] = x * this._worldScale[0]; this._look[1] = y * this._worldScale[1]; this._look[2] = z } ResetModelView(alternateUpVector) { mat4.lookAt(this._matMV, this._cam, this._look, alternateUpVector || this._up); mat4.scale(this._matMV, this._matMV, this._worldScale) } Translate(x, y) { if (x === 0 && y === 0) return; tmpVec3[0] = x; tmpVec3[1] = y; tmpVec3[2] = 0; mat4.translate(this._matMV, this._matMV, tmpVec3) } Scale(x, y) { if (x === 1 && y === 1) return; tmpVec3[0] = x; tmpVec3[1] = y; tmpVec3[2] = 1; mat4.scale(this._matMV, this._matMV, tmpVec3) } RotateZ(a) { if (a === 0) return; mat4.rotateZ(this._matMV, this._matMV, a) } _AddShaderProgram(sp) { this._allShaderPrograms.push(sp); this._shaderProgramsByName.set(sp.GetName(), sp) } _RemoveShaderProgram(sp) { const i = this._allShaderPrograms.indexOf(sp); if (i !== -1) this._allShaderPrograms.splice(i, 1); this._shaderProgramsByName.delete(sp.GetName()) } _ClearAllShaderPrograms() { C3.clearArray(this._allShaderPrograms); this._shaderProgramsByName.clear() } GetShaderProgramByName(name) { return this._shaderProgramsByName.get(name) || null } GetTextureFillShaderProgram() { return this._spTextureFill } _SetCurrentStateGroup(sg) { this._currentStateGroup = sg } GetCurrentStateGroup() { return this._currentStateGroup } AcquireStateGroup(shaderProgram_or_name, blendMode, color, zElevation) { const key = C3.Gfx.StateGroup.MakeKey(shaderProgram_or_name, blendMode, color, zElevation); let stateGroup = this._stateGroups.get(key); if (!stateGroup) { stateGroup = C3.New(C3.Gfx.StateGroup, this, shaderProgram_or_name, blendMode, color, zElevation); this._stateGroups.set(key, stateGroup) } stateGroup.AddRef(); return stateGroup } ReleaseStateGroup(stateGroup) { stateGroup.DecRef(); if (stateGroup._GetRefCount() === 0) { if (this._currentStateGroup === stateGroup) this._currentStateGroup = null; this._stateGroups.delete(stateGroup.GetKey()); stateGroup.Release() } } _InitBlendModeData(blendModeData) { C3.clearArray(this._blendModeTable); this._namedBlendModeMap.clear(); for (const bmd of blendModeData) { const name = bmd[0]; const srcBlend = bmd[1]; const destBlend = bmd[2]; this._blendModeTable.push([srcBlend, destBlend]); this._namedBlendModeMap.set(name, { srcBlend, destBlend }) } } _GetBlendByIndex(blendIndex) { return this._blendModeTable[blendIndex] } GetSrcBlendByIndex(blendIndex) { return this._GetBlendByIndex(blendIndex)[0] } GetDestBlendByIndex(blendIndex) { return this._GetBlendByIndex(blendIndex)[1] } GetNamedBlend(blendName) { const ret = this._namedBlendModeMap.get(blendName); if (typeof ret === "undefined") throw new Error("invalid blend name"); return ret } Finish() { this.EndBatch(); this._frameNumber++ } GetFrameNumber() { return this._frameNumber } IncrementFrameNumber() { this._frameNumber++ } SetMipmapsEnabled(e) { this._enableMipmaps = !!e } AreMipmapsEnabled() { return this._enableMipmaps } } } ;'use strict'; { const C3 = self.C3; C3.Gfx.StateGroup = class StateGroup { constructor(renderer, shaderProgram_or_name, blendMode, color, zElevation) { this._renderer = renderer; this._refCount = 0; this._shaderProgram = null; this._shaderProgramName = ""; this._blendMode = blendMode; this._color = C3.New(C3.Color); this._color.set(color); this._zElevation = zElevation; if (typeof shaderProgram_or_name === "string") this._shaderProgramName = shaderProgram_or_name; else { this._shaderProgram = shaderProgram_or_name; this._shaderProgramName = this._shaderProgram.GetName() } } Release() { if (this._refCount > 0) throw new Error("releasing state group still in use"); this._renderer = null; this._shaderProgram = null; this._shaderProgramName = "" } Apply() { const renderer = this._renderer; renderer.SetProgram(this._shaderProgram); renderer.SetBlendMode(this._blendMode); renderer.SetColor(this._color); renderer.SetCurrentZ(this._zElevation); renderer._SetCurrentStateGroup(this) } GetKey() { return C3.Gfx.StateGroup.MakeKey(this._shaderProgramName, this._blendMode, this._color, this._zElevation) } AddRef() { ++this._refCount } DecRef() { --this._refCount } _GetRefCount() { return this._refCount } OnContextLost() { this._shaderProgram = null } OnContextRestored(renderer) { this._shaderProgram = renderer.GetShaderProgramByName(this._shaderProgramName); if (!this._shaderProgram) throw new Error("failed to restore shader program"); } static MakeKey(shaderProgram_or_name, blendMode, c, zElevation) { const shaderProgramName = typeof shaderProgram_or_name === "string" ? shaderProgram_or_name : shaderProgram_or_name.GetName(); return shaderProgramName + "," + blendMode + "," + c.getR() + "," + c.getG() + "," + c.getB() + "," + c.getA() + "," + zElevation } } } ;'use strict'; { const C3 = self.C3; const tempQuadPos = C3.New(C3.Quad); const tempQuadTex = C3.New(C3.Quad); function interpolateQuad(srcX, srcY, quad) { const qtlx = quad.getTlx(); const qtly = quad.getTly(); const qtrx = quad.getTrx() - qtlx; const qtry = quad.getTry() - qtly; const qblx = quad.getBlx() - qtlx; const qbly = quad.getBly() - qtly; const xix = qtrx * srcX; const xiy = qtry * srcX; const yix = qblx * srcY; const yiy = qbly * srcY; return [qtlx + xix + yix, qtly + xiy + yiy] } class MeshPoint { constructor(mesh) { this._mesh = mesh; this._x = NaN; this._y = NaN; this._u = NaN; this._v = NaN; this._x = 0; this._y = 0; this._u = 0; this._v = 0 } _Init(x, y, u, v) { this._x = x; this._y = y; this._u = u; this._v = v } GetX() { return this._x } SetX(x) { if (this._x === x) return; this._x = x; this._mesh._SetPointsChanged() } GetY() { return this._y } SetY(y) { if (this._y === y) return; this._y = y; this._mesh._SetPointsChanged() } GetU() { return this._u } SetU(u) { this._u = u } GetV() { return this._v } SetV(v) { this._v = v } _Interpolate_TexRect(srcPoint, quadPos, rcTex) { [this._x,this._y] = interpolateQuad(srcPoint._x, srcPoint._y, quadPos); this._u = C3.lerp(rcTex.getLeft(), rcTex.getRight(), srcPoint._u); this._v = C3.lerp(rcTex.getTop(), rcTex.getBottom(), srcPoint._v) } _Interpolate_TexQuad(srcPoint, quadPos, quadTex) { [this._x,this._y] = interpolateQuad(srcPoint._x, srcPoint._y, quadPos); [this._u,this._v] = interpolateQuad(srcPoint._u, srcPoint._v, quadTex) } } C3.Gfx.Mesh = class Mesh { constructor(hsize, vsize) { if (hsize < 2 || vsize < 2) throw new Error("invalid mesh size"); this._hsize = hsize; this._vsize = vsize; this._pts = []; this._minX = 0; this._minY = 0; this._maxX = 1; this._maxY = 1; this._pointsChanged = false; const lastX = hsize - 1; const lastY = vsize - 1; for (let y = 0; y < vsize; ++y) { const row = []; for (let x = 0; x < hsize; ++x) { const meshPoint = C3.New(MeshPoint, this); const xf = x / lastX; const yf = y / lastY; meshPoint._Init(xf, yf, xf, yf); row.push(meshPoint) } this._pts.push(row) } } Release() { C3.clearArray(this._pts) } GetHSize() { return this._hsize } GetVSize() { return this._vsize } _SetPointsChanged() { this._pointsChanged = true } _MaybeComputeBounds() { if (!this._pointsChanged) return; let minX = Infinity; let minY = Infinity; let maxX = -Infinity; let maxY = -Infinity; for (const row of this._pts) for (const meshPoint of row) { const x = meshPoint.GetX(); const y = meshPoint.GetY(); minX = Math.min(minX, x); minY = Math.min(minY, y); maxX = Math.max(maxX, x); maxY = Math.max(maxY, y) } this._minX = minX; this._minY = minY; this._maxX = maxX; this._maxY = maxY; this._pointsChanged = false } GetMinX() { this._MaybeComputeBounds(); return this._minX } GetMinY() { this._MaybeComputeBounds(); return this._minY } GetMaxX() { this._MaybeComputeBounds(); return this._maxX } GetMaxY() { this._MaybeComputeBounds(); return this._maxY } GetMeshPointAt(x, y) { x = Math.floor(x); y = Math.floor(y); if (x < 0 || x >= this._hsize || y < 0 || y >= this._vsize) return null; return this._pts[y][x] } CalculateTransformedMesh(srcMesh, quadPos, rcTex_or_quad) { const isTexRect = rcTex_or_quad instanceof C3.Rect; if (srcMesh.GetHSize() !== this.GetHSize() || srcMesh.GetVSize() !== this.GetVSize()) throw new Error("source mesh wrong size"); const srcPts = srcMesh._pts; const destPts = this._pts; for (let y = 0, lenY = destPts.length; y < lenY; ++y) { const srcRow = srcPts[y]; const destRow = destPts[y]; for (let x = 0, lenX = destRow.length; x < lenX; ++x) { const srcPoint = srcRow[x]; const destPoint = destRow[x]; if (isTexRect) destPoint._Interpolate_TexRect(srcPoint, quadPos, rcTex_or_quad); else destPoint._Interpolate_TexQuad(srcPoint, quadPos, rcTex_or_quad) } } } Draw(renderer) { const pts = this._pts; let prevRow = pts[0]; for (let y = 1, lenY = pts.length; y < lenY; ++y) { const row = pts[y]; let tl = prevRow[0]; let bl = row[0]; for (let x = 1, lenX = row.length; x < lenX; ++x) { const tr = prevRow[x]; const br = row[x]; tempQuadPos.set(tl.GetX(), tl.GetY(), tr.GetX(), tr.GetY(), br.GetX(), br.GetY(), bl.GetX(), bl.GetY()); tempQuadTex.set(tl.GetU(), tl.GetV(), tr.GetU(), tr.GetV(), br.GetU(), br.GetV(), bl.GetU(), bl.GetV()); renderer.Quad4(tempQuadPos, tempQuadTex); tl = tr; bl = br } prevRow = row } } Outline(renderer) { const pts = this._pts; let prevRow = pts[0]; for (let y = 1, lenY = pts.length; y < lenY; ++y) { const row = pts[y]; let tl = prevRow[0]; let bl = row[0]; for (let x = 1, lenX = row.length; x < lenX; ++x) { const tr = prevRow[x]; const br = row[x]; const tlx = tl.GetX(); const tly = tl.GetY(); const trx = tr.GetX(); const try_ = tr.GetY(); const brx = br.GetX(); const bry = br.GetY(); const blx = bl.GetX(); const bly = bl.GetY(); renderer.Line(tlx, tly, trx, try_); renderer.Line(tlx, tly, brx, bry); renderer.Line(tlx, tly, blx, bly); if (x === lenX - 1) renderer.Line(trx, try_, brx, bry); if (y === lenY - 1) renderer.Line(blx, bly, brx, bry); tl = tr; bl = br } prevRow = row } } InsertPolyMeshVertices(srcPoly) { const RAY_EXT_DIST = .001; const MIN_RAY_DIST = 0; const MAX_RAY_DIST = .99999999; const inPts = srcPoly.pointsArr(); const outPts = []; const colCount = this.GetHSize() - 1; const rowCount = this.GetVSize() - 1; const colWidthNorm = 1 / colCount; const rowHeightNorm = 1 / rowCount; const lastCol = colCount - 1; const lastRow = rowCount - 1; let curX = inPts[0]; let curY = inPts[1]; let curCol = C3.clamp(Math.floor(curX * colCount), 0, lastCol); let curRow = C3.clamp(Math.floor(curY * rowCount), 0, lastRow); let isUpper = true; let nextX = 0; let nextY = 0; let rayHit = 0; const NOTHING_DISABLED = -1; const DISABLE_DIAGONAL = 0; const DISABLE_LEFT_EDGE = 1; const DISABLE_TOP_EDGE = 2; const DISABLE_RIGHT_EDGE = 3; const DISABLE_BOTTOM_EDGE = 4; let disableCheck = NOTHING_DISABLED; const addVertexAtRayHit = ()=>{ curX = C3.clamp(C3.lerp(curX, nextX, rayHit), 0, 1); curY = C3.clamp(C3.lerp(curY, nextY, rayHit), 0, 1); outPts.push(curX, curY) } ; for (let i = 0, len = inPts.length; i < len; i += 2) { curX = inPts[i]; curY = inPts[i + 1]; outPts.push(curX, curY); curCol = C3.clamp(Math.floor(curX * colCount), 0, lastCol); curRow = C3.clamp(Math.floor(curY * rowCount), 0, lastRow); const j = (i + 2) % len; nextX = inPts[j]; nextY = inPts[j + 1]; disableCheck = NOTHING_DISABLED; while (true) { if (outPts.length > 1E6) throw new Error("Too many mesh poly points"); const srcTlx = curCol * colWidthNorm; const srcTly = curRow * rowHeightNorm; const srcBrx = (curCol + 1) * colWidthNorm; const srcBry = (curRow + 1) * rowHeightNorm; isUpper = C3.isPointInTriangleInclusive(curX, curY, srcTlx, srcTly, srcBrx, srcTly, srcBrx, srcBry); if (disableCheck !== DISABLE_DIAGONAL) { rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcTly, srcBrx, srcBry, -RAY_EXT_DIST); if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) { addVertexAtRayHit(); isUpper = !isUpper; disableCheck = DISABLE_DIAGONAL; continue } } if (curRow > 0 && disableCheck !== DISABLE_TOP_EDGE) { rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcTly, srcBrx, srcTly, RAY_EXT_DIST); if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) { addVertexAtRayHit(); curRow--; isUpper = false; disableCheck = DISABLE_BOTTOM_EDGE; continue } } if (curCol < lastCol && disableCheck !== DISABLE_RIGHT_EDGE) { rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcBrx, srcTly, srcBrx, srcBry, RAY_EXT_DIST); if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) { addVertexAtRayHit(); curCol++; isUpper = false; disableCheck = DISABLE_LEFT_EDGE; continue } } if (curCol > 0 && disableCheck !== DISABLE_LEFT_EDGE) { rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcTly, srcTlx, srcBry, RAY_EXT_DIST); if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) { addVertexAtRayHit(); curCol--; isUpper = true; disableCheck = DISABLE_RIGHT_EDGE; continue } } if (curRow < lastRow && disableCheck !== DISABLE_BOTTOM_EDGE) { rayHit = C3.rayIntersectExtended(curX, curY, nextX, nextY, srcTlx, srcBry, srcBrx, srcBry, RAY_EXT_DIST); if (rayHit >= MIN_RAY_DIST && rayHit <= MAX_RAY_DIST) { addVertexAtRayHit(); curRow++; isUpper = true; disableCheck = DISABLE_TOP_EDGE; continue } } break } } return C3.New(C3.CollisionPoly, outPts) } TransformCollisionPoly(srcPoly, destPoly) { const ptsArr = this._TransformPolyPoints(srcPoly); this._SimplifyPoly(ptsArr); destPoly.setPoints(ptsArr) } _TransformPolyPoints(srcPoly) { const outPts = []; const ptsArr = srcPoly.pointsArr(); for (let i = 0, len = ptsArr.length; i < len; i += 2) { const srcX = ptsArr[i]; const srcY = ptsArr[i + 1]; const [destX,destY] = this.TransformPoint(srcX, srcY); outPts.push(destX, destY) } return outPts } TransformPoint(srcX, srcY) { const lastCol = this.GetHSize() - 1; const lastRow = this.GetVSize() - 1; const colWidthNorm = 1 / lastCol; const rowHeightNorm = 1 / lastRow; const srcCol = C3.clamp(Math.floor(srcX * lastCol), 0, lastCol - 1); const srcRow = C3.clamp(Math.floor(srcY * lastRow), 0, lastRow - 1); const srcTlx = srcCol * colWidthNorm; const srcTly = srcRow * rowHeightNorm; const srcBrx = (srcCol + 1) * colWidthNorm; const srcBry = (srcRow + 1) * rowHeightNorm; const destTl = this.GetMeshPointAt(srcCol, srcRow); const destBr = this.GetMeshPointAt(srcCol + 1, srcRow + 1); const isUpper = C3.isPointInTriangleInclusive(srcX, srcY, srcTlx, srcTly, srcBrx, srcTly, srcBrx, srcBry); const srcAltX = isUpper ? srcTlx + colWidthNorm : srcTlx; const srcAltY = isUpper ? srcTly : srcTly + rowHeightNorm; const destAlt = this.GetMeshPointAt(srcCol + (isUpper ? 1 : 0), srcRow + (isUpper ? 0 : 1)); const [u,v,w] = C3.triangleCartesianToBarycentric(srcX, srcY, srcTlx, srcTly, srcAltX, srcAltY, srcBrx, srcBry); return C3.triangleBarycentricToCartesian(u, v, w, destTl.GetX(), destTl.GetY(), destAlt.GetX(), destAlt.GetY(), destBr.GetX(), destBr.GetY()) } _SimplifyPoly(ptsArr) { const outPts = []; const EPSILON = 1E-7; let curX = ptsArr[0]; let curY = ptsArr[1]; let lastDx = curX - ptsArr[ptsArr.length - 2]; let lastDy = curY - ptsArr[ptsArr.length - 1]; for (let i = 0, len = ptsArr.length; i < len; i += 2) { const j = (i + 2) % len; const nextX = ptsArr[j]; const nextY = ptsArr[j + 1]; const dx = nextX - curX; const dy = nextY - curY; const bothXNearZero = Math.abs(dx) < EPSILON && Math.abs(lastDx) < EPSILON && Math.sign(dy) === Math.sign(lastDy); const bothYNearZero = Math.abs(dy) < EPSILON && Math.abs(lastDy) < EPSILON && Math.sign(dx) === Math.sign(lastDx); if (!bothXNearZero && !bothYNearZero && Math.abs(dx / lastDx - dy / lastDy) > EPSILON || dx == 0 && dy === 0) outPts.push(curX, curY); curX = nextX; curY = nextY; lastDx = dx; lastDy = dy } if (outPts.length < ptsArr.length) C3.shallowAssignArray(ptsArr, outPts) } } } ;'use strict'; { const C3 = self.C3; const VALID_PIXEL_FORMATS = new Set(["rgba8", "rgb8", "rgba4", "rgb5_a1", "rgb565"]); const VALID_SAMPLINGS = new Set(["nearest", "bilinear", "trilinear"]); const VALID_MIPMAP_QUALITIES = new Set(["default", "low", "high"]); const VALID_WRAP_MODES = new Set(["clamp-to-edge", "repeat", "mirror-repeat"]); function GetFormatSpecifiers(pixelFormat, gl) { let sizedinternalformat; let internalformat; let format; let type; switch (pixelFormat) { case "rgba8": sizedinternalformat = gl.RGBA8; internalformat = gl.RGBA; format = gl.RGBA; type = gl.UNSIGNED_BYTE; break; case "rgb8": sizedinternalformat = gl.RGB8; internalformat = gl.RGB; format = gl.RGB; type = gl.UNSIGNED_BYTE; break; case "rgba4": sizedinternalformat = gl.RGBA4; internalformat = gl.RGBA; format = gl.RGBA; type = gl.UNSIGNED_SHORT_4_4_4_4; break; case "rgb5_a1": sizedinternalformat = gl.RGB5_A1; internalformat = gl.RGBA; format = gl.RGBA; type = gl.UNSIGNED_SHORT_5_5_5_1; break; case "rgb565": sizedinternalformat = gl.RGB565; internalformat = gl.RGB; format = gl.RGB; type = gl.UNSIGNED_SHORT_5_6_5; break; default: throw new Error("invalid pixel format"); } return { sizedinternalformat, internalformat, format, type } } const CREATEFROM_DEFAULT_OPTIONS = { wrapX: "clamp-to-edge", wrapY: "clamp-to-edge", sampling: "trilinear", pixelFormat: "rgba8", mipMap: true, mipMapQuality: "default", premultiplyAlpha: true, isSvg: false, width: -1, height: -1 }; const UPDATE_DEFAULT_OPTIONS = { premultiplyAlpha: true, flipY: false }; const allTextures = new Set; C3.Gfx.WebGLRendererTexture = class WebGLRendererTexture { constructor(renderer) { this._renderer = renderer; this._texture = null; this._width = 0; this._height = 0; this._isStatic = true; this._wrapX = "clamp-to-edge"; this._wrapY = "clamp-to-edge"; this._sampling = "trilinear"; this._pixelFormat = "rgba8"; this._isMipMapped = false; this._mipMapQuality = "default"; this._refCount = 0 } _CreateStatic(data, opts) { if ((typeof HTMLImageElement === "undefined" || !(data instanceof HTMLImageElement)) && (typeof HTMLCanvasElement === "undefined" || !(data instanceof HTMLCanvasElement)) && (typeof ImageBitmap === "undefined" || !(data instanceof ImageBitmap)) && (typeof OffscreenCanvas === "undefined" || !(data instanceof OffscreenCanvas)) && !(data instanceof ImageData) && !(data instanceof ArrayBuffer) && data !== null) throw new Error("invalid texture source"); opts = Object.assign({}, CREATEFROM_DEFAULT_OPTIONS, opts); if (this._texture) throw new Error("already created texture"); this._wrapX = opts.wrapX; this._wrapY = opts.wrapY; this._sampling = opts.sampling; this._pixelFormat = opts.pixelFormat; this._isMipMapped = !!opts.mipMap && this._renderer.AreMipmapsEnabled(); this._mipMapQuality = opts.mipMapQuality; if (!VALID_WRAP_MODES.has(this._wrapX) || !VALID_WRAP_MODES.has(this._wrapY)) throw new Error("invalid wrap mode"); if (!VALID_SAMPLINGS.has(this._sampling)) throw new Error("invalid sampling"); if (!VALID_PIXEL_FORMATS.has(this._pixelFormat)) throw new Error("invalid pixel format"); if (!VALID_MIPMAP_QUALITIES.has(this._mipMapQuality)) throw new Error("invalid mipmap quality"); this._isStatic = true; if (data instanceof ArrayBuffer || data === null || opts.isSvg) { this._width = opts.width; this._height = opts.height; if (data instanceof ArrayBuffer && data.byteLength !== this._width * this._height * 4) throw new Error("ArrayBuffer wrong size"); } else { this._width = data.width; this._height = data.height } if (this._width <= 0 || this._height <= 0) throw new Error("invalid texture data size"); if (opts.isSvg) { const canvas = C3.CreateCanvas(this._width, this._height); const ctx = canvas.getContext("2d"); ctx.drawImage(data, 0, 0, this._width, this._height); data = canvas } const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height); const maxTextureSize = this._renderer.GetMaxTextureSize(); if (this._width > maxTextureSize || this._height > maxTextureSize) throw new Error("texture data exceeds maximum texture size"); const gl = this._renderer.GetContext(); const webglVersion = this._renderer.GetWebGLVersionNumber(); this._texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this._texture); gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], opts.premultiplyAlpha); const formatspec = GetFormatSpecifiers(this._pixelFormat, gl); if (!this._renderer.SupportsNPOTTextures() && !isPOT && this._IsTiled()) { if (data === null) throw new Error("cannot pass null data when creating a NPOT tiled texture without NPOT support"); if (data instanceof ArrayBuffer) data = new ImageData(new Uint8ClampedArray(data),this._width,this._height); if (data instanceof ImageData) { const tmpCanvas = C3.CreateCanvas(this._width, this._height); const tmpCtx = tmpCanvas.getContext("2d"); tmpCtx.putImageData(data, 0, 0); data = tmpCanvas } const canvas = C3.CreateCanvas(C3.nextHighestPowerOfTwo(this._width), C3.nextHighestPowerOfTwo(this._height)); const ctx = canvas.getContext("2d"); ctx.imageSmoothingEnabled = this._sampling !== "nearest"; ctx.drawImage(data, 0, 0, this._width, this._height, 0, 0, canvas.width, canvas.height); gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, formatspec.format, formatspec.type, canvas) } else if (webglVersion >= 2) { let levels; if (this._isMipMapped) levels = Math.floor(Math.log2(Math.max(this._width, this._height)) + 1); else levels = 1; gl.texStorage2D(gl.TEXTURE_2D, levels, formatspec.sizedinternalformat, this._width, this._height); if (data instanceof ArrayBuffer) gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this._width, this._height, formatspec.format, formatspec.type, new Uint8Array(data)); else if (data !== null) gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, formatspec.format, formatspec.type, data) } else if (data instanceof ArrayBuffer) gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, this._width, this._height, 0, formatspec.format, formatspec.type, new Uint8Array(data)); else if (data === null) gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, this._width, this._height, 0, formatspec.format, formatspec.type, null); else gl.texImage2D(gl.TEXTURE_2D, 0, formatspec.internalformat, formatspec.format, formatspec.type, data); if (data !== null) this._SetTextureParameters(gl); gl.bindTexture(gl.TEXTURE_2D, null); this._renderer._ResetLastTexture(); this._refCount = 1; allTextures.add(this) } _CreateDynamic(width, height, opts) { opts = Object.assign({}, CREATEFROM_DEFAULT_OPTIONS, opts); if (this._texture) throw new Error("already created texture"); this._wrapX = opts.wrapX; this._wrapY = opts.wrapY; this._sampling = opts.sampling; this._pixelFormat = opts.pixelFormat; this._isMipMapped = !!opts.mipMap && this._renderer.AreMipmapsEnabled(); this._mipMapQuality = opts.mipMapQuality; if (!VALID_WRAP_MODES.has(this._wrapX) || !VALID_WRAP_MODES.has(this._wrapY)) throw new Error("invalid wrap mode"); if (!VALID_SAMPLINGS.has(this._sampling)) throw new Error("invalid sampling"); if (!VALID_PIXEL_FORMATS.has(this._pixelFormat)) throw new Error("invalid pixel format"); if (!VALID_MIPMAP_QUALITIES.has(this._mipMapQuality)) throw new Error("invalid mipmap quality"); this._isStatic = false; this._width = Math.floor(width); this._height = Math.floor(height); const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height); const maxTextureSize = this._renderer.GetMaxTextureSize(); if (this._width <= 0 || this._height <= 0) throw new Error("invalid texture size"); if (this._width > maxTextureSize || this._height > maxTextureSize) throw new Error("texture exceeds maximum texture size"); if (!this._renderer.SupportsNPOTTextures() && this._IsTiled() && !isPOT) throw new Error("non-power-of-two tiled textures not supported"); const gl = this._renderer.GetContext(); const webglVersion = this._renderer.GetWebGLVersionNumber(); this._texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this._texture); gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], opts.premultiplyAlpha); const formatspec = GetFormatSpecifiers(this._pixelFormat, gl); const internalformat = webglVersion >= 2 ? formatspec.sizedinternalformat : formatspec.internalformat; gl.texImage2D(gl.TEXTURE_2D, 0, internalformat, this._width, this._height, 0, formatspec.format, formatspec.type, null); this._SetTextureParameters(gl); gl.bindTexture(gl.TEXTURE_2D, null); this._renderer._ResetLastTexture(); this._refCount = 1; allTextures.add(this) } _GetMipMapHint(gl) { if (this._mipMapQuality === "default") return this._isStatic ? gl.NICEST : gl.FASTEST; else if (this._mipMapQuality === "low") return gl.FASTEST; else if (this._mipMapQuality === "high") return gl.NICEST; else throw new Error("invalid mipmap quality"); } _IsTiled() { return this._wrapX !== "clamp-to-edge" || this._wrapY !== "clamp-to-edge" } _GetTextureWrapMode(gl, wrapMode) { if (wrapMode === "clamp-to-edge") return gl.CLAMP_TO_EDGE; else if (wrapMode === "repeat") return gl.REPEAT; else if (wrapMode === "mirror-repeat") return gl.MIRRORED_REPEAT; else throw new Error("invalid wrap mode"); } _SetTextureParameters(gl) { const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, this._GetTextureWrapMode(gl, this._wrapX)); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, this._GetTextureWrapMode(gl, this._wrapY)); if (this._sampling === "nearest") { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); this._isMipMapped = false } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); if ((isPOT || this._renderer.SupportsNPOTTextures()) && this._isMipMapped) { gl.hint(gl.GENERATE_MIPMAP_HINT, this._GetMipMapHint(gl)); gl.generateMipmap(gl.TEXTURE_2D); const useTrilinear = this._sampling === "trilinear" && !this._renderer.HasMajorPerformanceCaveat(); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useTrilinear ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR_MIPMAP_NEAREST) } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); this._isMipMapped = false } } } _Update(data, opts) { if ((typeof HTMLImageElement === "undefined" || !(data instanceof HTMLImageElement)) && (typeof HTMLVideoElement === "undefined" || !(data instanceof HTMLVideoElement)) && (typeof HTMLCanvasElement === "undefined" || !(data instanceof HTMLCanvasElement)) && (typeof ImageBitmap === "undefined" || !(data instanceof ImageBitmap)) && (typeof OffscreenCanvas === "undefined" || !(data instanceof OffscreenCanvas)) && !(data instanceof ImageData)) throw new Error("invalid texture source"); if (!this._texture || this._refCount <= 0) throw new Error("texture not created"); if (this._isStatic) throw new Error("cannot update static texture"); opts = Object.assign({}, UPDATE_DEFAULT_OPTIONS, opts); const dataWidth = data.width || data.videoWidth; const dataHeight = data.height || data.videoHeight; const webglVersion = this._renderer.GetWebGLVersionNumber(); const gl = this._renderer.GetContext(); gl.bindTexture(gl.TEXTURE_2D, this._texture); gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], opts.premultiplyAlpha); gl.pixelStorei(gl["UNPACK_FLIP_Y_WEBGL"], !!opts.flipY); const formatspec = GetFormatSpecifiers(this._pixelFormat, gl); const internalformat = webglVersion >= 2 ? formatspec.sizedinternalformat : formatspec.internalformat; try { if (this._width === dataWidth && this._height === dataHeight) { const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, formatspec.format, formatspec.type, data); if ((isPOT || this._renderer.SupportsNPOTTextures()) && this._isMipMapped) { gl.hint(gl.GENERATE_MIPMAP_HINT, this._GetMipMapHint(gl)); gl.generateMipmap(gl.TEXTURE_2D) } } else { this._width = dataWidth; this._height = dataHeight; const isPOT = C3.isPOT(this._width) && C3.isPOT(this._height); if (!this._renderer.SupportsNPOTTextures() && this._IsTiled() && !isPOT) throw new Error("non-power-of-two tiled textures not supported"); gl.texImage2D(gl.TEXTURE_2D, 0, internalformat, formatspec.format, formatspec.type, data); if ((isPOT || this._renderer.SupportsNPOTTextures()) && this._isMipMapped) { gl.hint(gl.GENERATE_MIPMAP_HINT, this._GetMipMapHint(gl)); gl.generateMipmap(gl.TEXTURE_2D) } } } catch (e) { console.error("Error updating WebGL texture: ", e) } gl.bindTexture(gl.TEXTURE_2D, null); this._renderer._ResetLastTexture() } _Delete() { if (this._refCount > 0) throw new Error("texture still has references"); if (!this._texture) throw new Error("already deleted texture"); allTextures.delete(this); const gl = this._renderer.GetContext(); gl.deleteTexture(this._texture); this._texture = null } IsValid() { return !!this._texture } _GetTexture() { return this._texture } GetRenderer() { return this._renderer } AddReference() { this._refCount++ } SubtractReference() { if (this._refCount <= 0) throw new Error("no more references"); this._refCount-- } GetReferenceCount() { return this._refCount } GetWidth() { return this._width } GetHeight() { return this._height } IsStatic() { return this._isStatic } GetEstimatedMemoryUsage() { let size = this._width * this._height; switch (this._pixelFormat) { case "rgba8": size *= 4; break; case "rgb8": size *= 3; break; case "rgba4": case "rgb5_a1": case "rgb565": size *= 2; break } if (this._isMipMapped) size += Math.floor(size / 3); return size } static OnContextLost() { allTextures.clear() } static allTextures() { return allTextures.values() } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; const VALID_SAMPLINGS = new Set(["nearest", "bilinear", "trilinear"]); const DEFAULT_RENDERTARGET_OPTIONS = { sampling: "trilinear", alpha: true, readback: true, isDefaultSize: true, multisampling: 0 }; const allRenderTargets = new Set; C3.Gfx.WebGLRenderTarget = class WebGLRenderTarget { constructor(renderer) { this._renderer = renderer; this._frameBuffer = null; this._texture = null; this._renderBuffer = null; this._width = 0; this._height = 0; this._isDefaultSize = true; this._sampling = "trilinear"; this._alpha = true; this._readback = true; this._multisampling = 0 } _Create(width, height, opts) { opts = Object.assign({}, DEFAULT_RENDERTARGET_OPTIONS, opts); const webGLVersion = this._renderer.GetWebGLVersionNumber(); if (this._texture || this._renderBuffer) throw new Error("already created render target"); this._sampling = opts.sampling; this._alpha = !!opts.alpha; this._readback = !!opts.readback; this._isDefaultSize = !!opts.isDefaultSize; this._multisampling = opts.multisampling; if (!VALID_SAMPLINGS.has(this._sampling)) throw new Error("invalid sampling"); if (this._multisampling > 0 && (webGLVersion < 2 || this._readback)) throw new Error("invalid use of multisampling"); if (webGLVersion < 2) this._readback = true; this._width = width; this._height = height; if (this._width <= 0 || this._height <= 0) throw new Error("invalid render target size"); const gl = this._renderer.GetContext(); this._frameBuffer = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer); if (this._readback) { this._texture = this._renderer.CreateDynamicTexture(this._width, this._height, { sampling: this._sampling, pixelFormat: this._alpha ? "rgba8" : "rgb8", mipMap: false }); const tex = this._texture._GetTexture(); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0) } else { this._renderBuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer); const internalFormat = this._alpha ? gl.RGBA8 : gl.RGB8; if (this._multisampling > 0) { const formatSamples = gl.getInternalformatParameter(gl.RENDERBUFFER, internalFormat, gl.SAMPLES); if (formatSamples && formatSamples[0]) { const maxSamples = formatSamples[0]; if (this._multisampling > maxSamples) this._multisampling = maxSamples } else this._multisampling = 0 } if (this._multisampling === 0) gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, this._width, this._height); else gl.renderbufferStorageMultisample(gl.RENDERBUFFER, this._multisampling, internalFormat, this._width, this._height); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this._renderBuffer); gl.bindRenderbuffer(gl.RENDERBUFFER, null) } gl.bindFramebuffer(gl.FRAMEBUFFER, null); allRenderTargets.add(this) } _Resize(width, height) { if (this._width === width && this._height === height) return; this._width = width; this._height = height; const gl = this._renderer.GetContext(); gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer); if (this._texture) this._texture._Update(new ImageData(this._width,this._height)); else { gl.bindRenderbuffer(gl.RENDERBUFFER, this._renderBuffer); gl.renderbufferStorage(gl.RENDERBUFFER, this._alpha ? gl.RGBA8 : gl.RGB8, this._width, this._height); gl.bindRenderbuffer(gl.RENDERBUFFER, null) } gl.bindFramebuffer(gl.FRAMEBUFFER, null) } _Delete() { if (!this._texture && !this._renderBuffer) throw new Error("already deleted render target"); allRenderTargets.delete(this); const gl = this._renderer.GetContext(); gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer); if (this._texture) { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0); this._renderer.DeleteTexture(this._texture); this._texture = null } else if (this._renderBuffer) { gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null); gl.deleteRenderbuffer(this._renderBuffer); this._renderBuffer = null } gl.bindFramebuffer(gl.FRAMEBUFFER, null); if (this._renderer.GetWebGLVersionNumber() >= 2) { gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null) } gl.deleteFramebuffer(this._frameBuffer); this._renderer.GetBatchState().currentFramebuffer = null; this._frameBuffer = null } _GetFramebuffer() { return this._frameBuffer } GetWebGLRenderer() { return this._renderer } GetTexture() { return this._texture } IsLinearSampling() { return this._sampling !== "nearest" } HasAlpha() { return this._alpha } IsReadback() { return this._readback } GetWidth() { return this._width } GetHeight() { return this._height } IsDefaultSize() { return this._isDefaultSize } GetMultisampling() { return this._multisampling } GetOptions() { const ret = { sampling: this._sampling, alpha: this._alpha, readback: this._readback }; if (!this._isDefaultSize) { ret.width = this._width; ret.height = this._height } return ret } IsCompatibleWithOptions(opts) { opts = Object.assign({}, DEFAULT_RENDERTARGET_OPTIONS, opts); if (opts.sampling !== "nearest" !== this.IsLinearSampling()) return false; if (!!opts.alpha !== this.HasAlpha()) return false; if (this._renderer.GetWebGLVersionNumber() >= 2) if (!!opts.readback !== this.IsReadback()) return false; if (typeof opts.width === "number" || typeof opts.height === "number") return !this.IsDefaultSize() && this.GetWidth() === opts.width && this.GetHeight() === opts.height; else return this.IsDefaultSize() } _GetWebGLTexture() { if (!this._texture) return null; return this._texture._GetTexture() } GetEstimatedMemoryUsage() { if (this._texture) return this._texture.GetEstimatedMemoryUsage(); return this._width * this._height * (this._alpha ? 4 : 3) } static async DebugReadPixelsToBlob(renderer, renderTarget) { const imageData = await renderer.ReadBackRenderTargetToImageData(renderTarget, true); return await C3.ImageDataToBlob(imageData) } static OnContextLost() { allRenderTargets.clear() } static allRenderTargets() { return allRenderTargets.values() } static ResizeAll(width, height) { for (const rt of allRenderTargets) if (rt.IsDefaultSize()) rt._Resize(width, height) } } } ;'use strict'; { const C3 = self.C3; const glMatrix = self.glMatrix; const vec3 = glMatrix.vec3; const mat4 = glMatrix.mat4; const RESERVED_UNIFORM_NAMES = new Set(["aPos", "aTex", "aPoints", "matP", "matMV", "samplerFront", "samplerBack", "destStart", "destEnd", "srcStart", "srcEnd", "srcOriginStart", "srcOriginEnd", "pixelSize", "seconds", "layerScale", "layerAngle", "layoutStart", "layoutEnd", "color", "color2_", "pointTexStart", "pointTexEnd", "zElevation", "tileSize", "tileSpacing", "outlineThickness"]); C3.Gfx.WebGLShaderProgram = class WebGLShaderProgram { static async Compile(renderer, fragSrc, vsSource, name) { const gl = renderer.GetContext(); const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragSrc); gl.compileShader(fragmentShader); const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vsSource); gl.compileShader(vertexShader); const shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, fragmentShader); gl.attachShader(shaderProgram, vertexShader); gl.bindAttribLocation(shaderProgram, 0, "aPos"); gl.bindAttribLocation(shaderProgram, 1, "aTex"); gl.bindAttribLocation(shaderProgram, 2, "aPoints"); gl.linkProgram(shaderProgram); const parallelShaderCompileExt = renderer._GetParallelShaderCompileExtension(); if (parallelShaderCompileExt) await renderer._WaitForObjectReady(()=>gl.getProgramParameter(shaderProgram, parallelShaderCompileExt["COMPLETION_STATUS_KHR"])); else await C3.Wait(5); if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { const log = gl.getShaderInfoLog(fragmentShader); gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); gl.deleteProgram(shaderProgram); throw new Error("Error compiling fragment shader: " + log); } if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { const log = gl.getShaderInfoLog(vertexShader); gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); gl.deleteProgram(shaderProgram); throw new Error("Error compiling vertex shader: " + log); } if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { const log = gl.getProgramInfoLog(shaderProgram); gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); gl.deleteProgram(shaderProgram); throw new Error("Error linking shader program: " + log); } const infoLog = C3.FilterUnprintableChars(gl.getProgramInfoLog(shaderProgram) || "").trim(); if (infoLog && !C3.IsStringAllWhitespace(infoLog)) console.info(`[WebGL] Shader program '${name}' compilation log: `, infoLog); gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); return shaderProgram } static async Create(renderer, shaderInfo, vsSource, name) { const shaderProgram = await C3.Gfx.WebGLShaderProgram.Compile(renderer, shaderInfo.src, vsSource, name); return new C3.Gfx.WebGLShaderProgram(renderer,shaderProgram,shaderInfo,name) } constructor(renderer, shaderProgram, shaderInfo, name) { const gl = renderer.GetContext(); const batchState = renderer.GetBatchState(); renderer.EndBatch(); gl.useProgram(shaderProgram); this._gl = gl; this._renderer = renderer; this._name = name; this._shaderProgram = shaderProgram; this._isDeviceTransform = name === ""; const locAPos = gl.getAttribLocation(shaderProgram, "aPos"); const locATex = gl.getAttribLocation(shaderProgram, "aTex"); const locAPoints = gl.getAttribLocation(shaderProgram, "aPoints"); if (locAPos !== -1) { gl.bindBuffer(gl.ARRAY_BUFFER, renderer._vertexBuffer); gl.vertexAttribPointer(locAPos, renderer.GetNumVertexComponents(), gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(locAPos) } if (locATex !== -1) { gl.bindBuffer(gl.ARRAY_BUFFER, renderer._texcoordBuffer); gl.vertexAttribPointer(locATex, 2, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(locATex) } if (locAPoints !== -1) { gl.bindBuffer(gl.ARRAY_BUFFER, renderer._pointBuffer); gl.vertexAttribPointer(locAPoints, 4, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(locAPoints) } gl.bindBuffer(gl.ARRAY_BUFFER, null); this._uMatP = new C3.Gfx.WebGLShaderUniform(this,"matP","mat4"); this._uMatMV = new C3.Gfx.WebGLShaderUniform(this,"matMV","mat4"); this._uColor = new C3.Gfx.WebGLShaderUniform(this,"color","vec4"); this._uSamplerFront = new C3.Gfx.WebGLShaderUniform(this,"samplerFront","sampler"); this._uPointTexStart = new C3.Gfx.WebGLShaderUniform(this,"pointTexStart","vec2"); this._uPointTexEnd = new C3.Gfx.WebGLShaderUniform(this,"pointTexEnd","vec2"); this._uZElevation = new C3.Gfx.WebGLShaderUniform(this,"zElevation","float"); this._uTileSize = new C3.Gfx.WebGLShaderUniform(this,"tileSize","vec2"); this._uTileSpacing = new C3.Gfx.WebGLShaderUniform(this,"tileSpacing","vec2"); this._uColor2 = new C3.Gfx.WebGLShaderUniform(this,"color2_","vec4"); this._uOutlineThickness = new C3.Gfx.WebGLShaderUniform(this,"outlineThickness","float"); this._uSamplerBack = new C3.Gfx.WebGLShaderUniform(this,"samplerBack","sampler"); this._uDestStart = new C3.Gfx.WebGLShaderUniform(this,"destStart","vec2"); this._uDestEnd = new C3.Gfx.WebGLShaderUniform(this,"destEnd","vec2"); this._uSrcStart = new C3.Gfx.WebGLShaderUniform(this,"srcStart","vec2"); this._uSrcEnd = new C3.Gfx.WebGLShaderUniform(this,"srcEnd","vec2"); this._uSrcOriginStart = new C3.Gfx.WebGLShaderUniform(this,"srcOriginStart","vec2"); this._uSrcOriginEnd = new C3.Gfx.WebGLShaderUniform(this,"srcOriginEnd","vec2"); this._uPixelSize = new C3.Gfx.WebGLShaderUniform(this,"pixelSize","vec2"); this._uSeconds = new C3.Gfx.WebGLShaderUniform(this,"seconds","float"); this._uLayerScale = new C3.Gfx.WebGLShaderUniform(this,"layerScale","float"); this._uLayerAngle = new C3.Gfx.WebGLShaderUniform(this,"layerAngle","float"); this._uLayoutStart = new C3.Gfx.WebGLShaderUniform(this,"layoutStart","vec2"); this._uLayoutEnd = new C3.Gfx.WebGLShaderUniform(this,"layoutEnd","vec2"); this._hasAnyOptionalUniforms = !!(this._uPixelSize.IsUsed() || this._uSeconds.IsUsed() || this._uSamplerBack.IsUsed() || this._uDestStart.IsUsed() || this._uDestEnd.IsUsed() || this._uSrcStart.IsUsed() || this._uSrcEnd.IsUsed() || this._uSrcOriginStart.IsUsed() || this._uSrcOriginEnd.IsUsed() || this._uLayerScale.IsUsed() || this._uLayerAngle.IsUsed() || this._uLayoutStart.IsUsed() || this._uLayoutEnd.IsUsed()); this._extendBoxHorizontal = shaderInfo.extendBoxHorizontal || 0; this._extendBoxVertical = shaderInfo.extendBoxVertical || 0; this._crossSampling = !!shaderInfo.crossSampling; this._mustPreDraw = !!shaderInfo.mustPreDraw; this._preservesOpaqueness = !!shaderInfo.preservesOpaqueness; this._animated = !!shaderInfo.animated; const customParameterDefs = shaderInfo.parameters || []; this._uCustomParameters = []; this._usesDest = this._uDestStart.IsUsed() || this._uDestEnd.IsUsed(); this._usesAnySrcRectOrPixelSize = this._uPixelSize.IsUsed() || this._uSrcStart.IsUsed() || this._uSrcEnd.IsUsed() || this._uSrcOriginStart.IsUsed() || this._uSrcOriginEnd.IsUsed(); this._needsPostDrawOrExtendBox = this._crossSampling || this._usesDest || this._extendBoxHorizontal !== 0 || this._extendBoxVertical !== 0; this._hasCurrentMatP = false; this._hasCurrentMatMV = false; this._uColor.Init4f(1, 1, 1, 1); this._uColor2.Init4f(1, 1, 1, 1); this._uSamplerFront.Init1i(0); this._uSamplerBack.Init1i(1); this._uPointTexStart.Init2f(0, 0); this._uPointTexEnd.Init2f(1, 1); this._uZElevation.Init1f(0); this._uTileSize.Init2f(0, 0); this._uTileSpacing.Init2f(0, 0); this._uDestStart.Init2f(0, 0); this._uDestEnd.Init2f(1, 1); this._uSrcStart.Init2f(0, 0); this._uSrcEnd.Init2f(0, 0); this._uSrcOriginStart.Init2f(0, 0); this._uSrcOriginEnd.Init2f(0, 0); this._uPixelSize.Init2f(0, 0); this._uLayerScale.Init1f(1); this._uLayerAngle.Init1f(0); this._uSeconds.Init1f(0); this._uLayoutStart.Init2f(0, 0); this._uLayoutEnd.Init2f(0, 0); this._uOutlineThickness.Init1f(1); for (const p of customParameterDefs) { const uniformName = p[0]; const paramType = p[2]; const shaderUniform = new C3.Gfx.WebGLShaderUniform(this,uniformName,paramType); if (paramType === "color") shaderUniform.Init3f(0, 0, 0); else shaderUniform.Init1f(0); this._uCustomParameters.push(shaderUniform) } if (this._isDeviceTransform) this._UpdateDeviceTransformUniforms(batchState.currentMatP); else { this.UpdateMatP(batchState.currentMatP, true); this.UpdateMatMV(batchState.currentMV, true) } const currentShader = batchState.currentShader; gl.useProgram(currentShader ? currentShader._shaderProgram : null) } Release() { this._gl.deleteProgram(this._shaderProgram); this._shaderProgram = null; this._renderer._RemoveShaderProgram(this); this._gl = null; this._renderer = null } GetName() { return this._name } GetWebGLContext() { return this._gl } GetShaderProgram() { return this._shaderProgram } UsesDest() { return this._usesDest } UsesCrossSampling() { return this._crossSampling } MustPreDraw() { return this._mustPreDraw } PreservesOpaqueness() { return this._preservesOpaqueness } ExtendsBox() { return this._extendBoxHorizontal !== 0 || this._extendBoxVertical !== 0 } GetBoxExtendHorizontal() { return this._extendBoxHorizontal } GetBoxExtendVertical() { return this._extendBoxVertical } UsesAnySrcRectOrPixelSize() { return this._usesAnySrcRectOrPixelSize } NeedsPostDrawOrExtendsBox() { return this._needsPostDrawOrExtendBox } GetParameterCount() { return this._uCustomParameters.length } GetParameterType(paramIndex) { return this._uCustomParameters[paramIndex].GetType() } AreCustomParametersAlreadySetInBatch(params) { for (let i = 0, len = params.length; i < len; ++i) if (!this._uCustomParameters[i].IsSetToCustomInBatch(params[i])) return false; return true } SetCustomParametersInBatch(params) { for (let i = 0, len = params.length; i < len; ++i) this._uCustomParameters[i].SetBatchValueCustom(params[i]) } AreOptionalUniformsAlreadySetInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time) { if (this._uSamplerBack.IsUsed()) return false; if (this._uPixelSize.IsUsed() && !this._uPixelSize.IsSetTo2InBatch(pixelWidth, pixelHeight)) return false; if (this._uDestStart.IsUsed() && !this._uDestStart.IsSetTo2InBatch(destRect.getLeft(), destRect.getTop())) return false; if (this._uDestEnd.IsUsed() && !this._uDestEnd.IsSetTo2InBatch(destRect.getRight(), destRect.getBottom())) return false; if (this._uLayerScale.IsUsed() && !this._uLayerScale.IsSetTo1InBatch(layerScale)) return false; if (this._uLayerAngle.IsUsed() && !this._uLayerAngle.IsSetTo1InBatch(layerAngle)) return false; if (this._uSrcStart.IsUsed() && !this._uSrcStart.IsSetTo2InBatch(srcRect.getLeft(), srcRect.getTop())) return false; if (this._uSrcEnd.IsUsed() && !this._uSrcEnd.IsSetTo2InBatch(srcRect.getRight(), srcRect.getBottom())) return false; if (this._uSrcOriginStart.IsUsed() && !this._uSrcOriginStart.IsSetTo2InBatch(srcOriginRect.getLeft(), srcOriginRect.getTop())) return false; if (this._uSrcOriginEnd.IsUsed() && !this._uSrcOriginEnd.IsSetTo2InBatch(srcOriginRect.getRight(), srcOriginRect.getBottom())) return false; if (this._uLayoutStart.IsUsed() && !this._uLayoutStart.IsSetTo2InBatch(layoutRect.getLeft(), layoutRect.getTop())) return false; if (this._uLayoutEnd.IsUsed() && !this._uLayoutEnd.IsSetTo2InBatch(layoutRect.getTop(), layoutRect.getBottom())) return false; if (this._uSeconds.IsUsed() && !this._uSeconds.IsSetTo1InBatch(time)) return false; return true } SetOptionalUniformsInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time) { if (this._uSamplerBack.IsUsed()) return; if (this._uPixelSize.IsUsed()) this._uPixelSize.SetBatch2(pixelWidth, pixelHeight); if (this._uDestStart.IsUsed()) this._uDestStart.SetBatch2(destRect.getLeft(), destRect.getTop()); if (this._uDestEnd.IsUsed()) this._uDestEnd.SetBatch2(destRect.getRight(), destRect.getBottom()); if (this._uLayerScale.IsUsed()) this._uLayerScale.SetBatch1(layerScale); if (this._uLayerAngle.IsUsed()) this._uLayerAngle.SetBatch1(layerAngle); if (this._uSrcStart.IsUsed()) this._uSrcStart.SetBatch2(srcRect.getLeft(), srcRect.getTop()); if (this._uSrcEnd.IsUsed()) this._uSrcEnd.SetBatch2(srcRect.getRight(), srcRect.getBottom()); if (this._uSrcOriginStart.IsUsed()) this._uSrcOriginStart.SetBatch2(srcOriginRect.getLeft(), srcOriginRect.getTop()); if (this._uSrcOriginEnd.IsUsed()) this._uSrcOriginEnd.SetBatch2(srcOriginRect.getRight(), srcOriginRect.getBottom()); if (this._uLayoutStart.IsUsed()) this._uLayoutStart.SetBatch2(layoutRect.getLeft(), layoutRect.getTop()); if (this._uLayoutEnd.IsUsed()) this._uLayoutEnd.SetBatch2(layoutRect.getTop(), layoutRect.getBottom()); if (this._uSeconds.IsUsed()) this._uSeconds.SetBatch1(time) } IsAnimated() { return this._animated } UpdateMatP(matP, force) { if (this._hasCurrentMatP && !force) return; if (this._isDeviceTransform) return; if (this._uMatP.IsUsed()) this._uMatP.UpdateMatrix4fv(matP); this._hasCurrentMatP = true } SetMatPStale() { this._hasCurrentMatP = false } UpdateMatMV(matMV, force) { if (this._hasCurrentMatMV && !force) return; if (this._isDeviceTransform) return; if (this._uMatMV.IsUsed()) this._uMatMV.UpdateMatrix4fv(matMV); this._hasCurrentMatMV = true } SetMatMVStale() { this._hasCurrentMatMV = false } _UpdateDeviceTransformUniforms(matP) { if (!this._isDeviceTransform) throw new Error("not device transform shader"); this._uMatP.UpdateMatrix4fv(matP); const renderer = this._renderer; const scrollX = renderer.GetWidth() / 2; const scrollY = renderer.GetHeight() / 2; const worldScale = renderer._worldScale; const cam = vec3.fromValues(scrollX * worldScale[0], scrollY * worldScale[1], 100 * self.devicePixelRatio); const look = vec3.fromValues(scrollX * worldScale[0], scrollY * worldScale[1], 0); const mv = mat4.create(); mat4.lookAt(mv, cam, look, renderer._up); mat4.scale(mv, mv, worldScale); this._uMatMV.UpdateMatrix4fv(mv) } UpdateColor(c) { if (this._uColor.IsUsed()) this._uColor.Update4f(c[0], c[1], c[2], c[3]) } static GetReservedUniformNames() { return RESERVED_UNIFORM_NAMES } static GetDefaultVertexShaderSource(is3d, useHighP) { const texPrecision = useHighP ? "highmedp" : "mediump"; return [`#ifdef GL_FRAGMENT_PRECISION_HIGH`, `#define highmedp highp`, `#else`, `#define highmedp mediump`, `#endif`, `attribute highp ${is3d ? "vec3" : "vec2"} aPos;`, `attribute ${texPrecision} vec2 aTex;`, `varying ${texPrecision} vec2 vTex;`, `uniform highp mat4 matP;`, `uniform highp mat4 matMV;`, `void main(void) {`, ` gl_Position = matP * matMV * vec4(aPos, ${is3d ? "" : "0.0,"} 1.0);`, ` vTex = aTex;`, `}`].join("\n") } static GetTextureFillFragmentShaderSource() { return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform lowp sampler2D samplerFront;", "void main(void) {", "\tgl_FragColor = texture2D(samplerFront, vTex) * color;", "}"].join("\n") } static GetTilemapFragmentShaderSource() { return ["#ifdef GL_FRAGMENT_PRECISION_HIGH", "#define highmedp highp", "#else", "#define highmedp mediump", "#endif", "varying highmedp vec2 vTex;", "uniform lowp vec4 color;", "uniform lowp sampler2D samplerFront;", "uniform highmedp vec2 srcStart;", "uniform highmedp vec2 pixelSize;", "uniform highmedp vec2 tileSize;", "uniform highmedp vec2 tileSpacing;", "void main(void) {", "\thighmedp vec2 tile = floor(vTex);", "\thighmedp vec2 tex = fract(vTex);", "\thighmedp vec2 tileOrigin = srcStart + tile * (tileSize + tileSpacing);", "\thighmedp vec2 lowerBound = tileOrigin + pixelSize / 2.0;", "\thighmedp vec2 upperBound = tileOrigin + tileSize - pixelSize / 2.0;", "\tgl_FragColor = texture2D(samplerFront, clamp(tex, lowerBound, upperBound), -16.0) * color;", "}"].join("\n") } static GetPointVertexShaderSource() { return ["attribute vec4 aPoints;", "varying float pointOpacity;", "uniform float zElevation;", "uniform mat4 matP;", "uniform mat4 matMV;", "void main(void) {", "\tgl_Position = matP * matMV * vec4(aPoints.xy, zElevation, 1.0);", "\tgl_PointSize = aPoints.z;", "\tpointOpacity = aPoints.w;", "}"].join("\n") } static GetPointFragmentShaderSource() { return ["uniform lowp sampler2D samplerFront;", "varying lowp float pointOpacity;", "uniform mediump vec2 pointTexStart;", "uniform mediump vec2 pointTexEnd;", "uniform lowp vec4 color;", "void main(void) {", "\tgl_FragColor = texture2D(samplerFront, mix(pointTexStart, pointTexEnd, gl_PointCoord)) * color * pointOpacity;", "}"].join("\n") } static GetColorFillFragmentShaderSource() { return ["uniform lowp vec4 color;", "void main(void) {", "\tgl_FragColor = color;", "}"].join("\n") } static GetLinearGradientFillFragmentShaderSource() { return ["precision lowp float;", "varying mediump vec2 vTex;", "uniform vec4 color;", "uniform vec4 color2_;", "vec3 fromLinear(vec3 linearRGB)", "{", "\tbvec3 cutoff = lessThan(linearRGB, vec3(0.0031308));", "\tvec3 higher = vec3(1.055) * pow(abs(linearRGB), vec3(1.0/2.4)) - vec3(0.055);", "\tvec3 lower = linearRGB * vec3(12.92);", "\treturn mix(higher, lower, vec3(cutoff));", "}", "vec3 toLinear(vec3 sRGB)", "{", "\tbvec3 cutoff = lessThan(sRGB, vec3(0.04045));", "\tvec3 higher = pow(abs((sRGB + vec3(0.055))/vec3(1.055)), vec3(2.4));", "\tvec3 lower = sRGB/vec3(12.92);", "\treturn mix(higher, lower, vec3(cutoff));", "}", "void main(void) {", "\tvec3 linearGrad = mix(toLinear(color.rgb), toLinear(color2_.rgb), vTex.x);", "\tfloat a = mix(color.a, color2_.a, vTex.x);", "\tgl_FragColor = vec4(fromLinear(linearGrad) * a, a);", "}"].join("\n") } static GetSmoothLineFillFragmentShaderSource() { return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "void main(void) {", "\tlowp float f = 1.0 - abs(vTex.y - 0.5) * 2.0;", "\tgl_FragColor = color * f;", "}"].join("\n") } static GetHardEllipseFillFragmentShaderSource() { return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump float f = step(diffSq.x + diffSq.y, 0.25);", "\tgl_FragColor = color * f;", "}"].join("\n") } static GetHardEllipseOutlineFragmentShaderSource() { return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform mediump vec2 pixelSize;", "uniform mediump float outlineThickness;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump float distSq = diffSq.x + diffSq.y;", "\tmediump vec2 norm = normalize(diff);", "\tmediump vec2 halfNorm = norm * 0.5;", "\tmediump float innerF = step(distSq, 0.25);", "\tmediump vec2 innerEdge = halfNorm - pixelSize * norm * outlineThickness;", "\tmediump vec2 innerEdgeSq = innerEdge * innerEdge;", "\tmediump float outerF = step(innerEdgeSq.x + innerEdgeSq.y, distSq);", "\tgl_FragColor = color * innerF * outerF;", "}"].join("\n") } static GetSmoothEllipseFillFragmentShaderSource() { return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform mediump vec2 pixelSize;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump vec2 norm = normalize(diff);", "\tmediump vec2 halfNorm = norm * 0.5;", "\tmediump vec2 halfNormSq = halfNorm * halfNorm;", "\tmediump vec2 innerEdge = halfNorm - pixelSize * norm;", "\tmediump vec2 innerEdgeSq = innerEdge * innerEdge;", "\tmediump float f = smoothstep(halfNormSq.x + halfNormSq.y, innerEdgeSq.x + innerEdgeSq.y, diffSq.x + diffSq.y);", "\tgl_FragColor = color * f;", "}"].join("\n") } static GetSmoothEllipseOutlineFragmentShaderSource() { return ["varying mediump vec2 vTex;", "uniform lowp vec4 color;", "uniform mediump vec2 pixelSize;", "uniform mediump float outlineThickness;", "void main(void) {", "\tmediump vec2 diff = vTex - vec2(0.5, 0.5);", "\tmediump vec2 diffSq = diff * diff;", "\tmediump float distSq = diffSq.x + diffSq.y;", "\tmediump vec2 norm = normalize(diff);", "\tmediump vec2 halfNorm = norm * 0.5;", "\tmediump vec2 halfNormSq = halfNorm * halfNorm;", "\tmediump vec2 pxNorm = pixelSize * norm;", "\tmediump vec2 innerEdge1 = halfNorm - pxNorm;", "\tmediump vec2 innerEdge1Sq = innerEdge1 * innerEdge1;", "\tmediump float innerF = smoothstep(halfNormSq.x + halfNormSq.y, innerEdge1Sq.x + innerEdge1Sq.y, distSq);", "\tmediump vec2 innerEdge2 = halfNorm - pxNorm * outlineThickness;", "\tmediump vec2 innerEdge2Sq = innerEdge2 * innerEdge2;", "\tmediump vec2 innerEdge3 = halfNorm - pxNorm * (outlineThickness + 1.0);", "\tmediump vec2 innerEdge3Sq = innerEdge3 * innerEdge3;", "\tmediump float outerF = smoothstep(innerEdge3Sq.x + innerEdge3Sq.y, innerEdge2Sq.x + innerEdge2Sq.y, distSq);", "\tgl_FragColor = color * innerF * outerF;", "}"].join("\n") } } } ;'use strict'; { const C3 = self.C3; const TYPE_SIZES = new Map([["float", 1], ["percent", 1], ["sampler", 1], ["vec2", 2], ["vec3", 3], ["color", 3], ["vec4", 4], ["mat4", 16]]); function areMat4sEqual(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15] } C3.Gfx.WebGLShaderUniform = class WebGLShaderUniform { constructor(owner, name, type) { if (!TYPE_SIZES.has(type)) throw new Error("invalid uniform type"); this._owner = owner; this._gl = this._owner.GetWebGLContext(); this._name = name; this._type = type; this._isColorType = this._type === "color"; this._location = this._gl.getUniformLocation(this._owner.GetShaderProgram(), name); this._isUsed = !!this._location; const typeSize = TYPE_SIZES.get(type); this._lastValue = new Float32Array(typeSize); this._lastBatchValue = new Float32Array(typeSize) } Release() { this._owner = null; this._gl = null; this._location = null } IsUsed() { return this._isUsed } GetType() { return this._type } IsColorType() { return this._isColorType } Init1f(v0) { if (!this.IsUsed()) return; this._lastValue[0] = v0; this._lastBatchValue.set(this._lastValue); this._gl.uniform1f(this._location, v0) } Init1i(v0) { if (!this.IsUsed()) return; this._lastValue[0] = v0; this._lastBatchValue.set(this._lastValue); this._gl.uniform1i(this._location, v0) } Init2f(v0, v1) { if (!this.IsUsed()) return; this._lastValue[0] = v0; this._lastValue[1] = v1; this._lastBatchValue.set(this._lastValue); this._gl.uniform2f(this._location, v0, v1) } Init3f(v0, v1, v2) { if (!this.IsUsed()) return; this._lastValue[0] = v0; this._lastValue[1] = v1; this._lastValue[2] = v2; this._lastBatchValue.set(this._lastValue); this._gl.uniform3f(this._location, v0, v1, v2) } Init4f(v0, v1, v2, v3) { if (!this.IsUsed()) return; this._lastValue[0] = v0; this._lastValue[1] = v1; this._lastValue[2] = v2; this._lastValue[3] = v3; this._lastBatchValue.set(this._lastValue); this._gl.uniform4f(this._location, v0, v1, v2, v3) } Update1f(v0) { v0 = Math.fround(v0); const lastValue = this._lastValue; if (lastValue[0] === v0) return; lastValue[0] = v0; this._gl.uniform1f(this._location, v0) } Update1i(v0) { const lastValue = this._lastValue; if (lastValue[0] === v0) return; lastValue[0] = v0; this._gl.uniform1i(this._location, v0) } Update2f(v0, v1) { v0 = Math.fround(v0); v1 = Math.fround(v1); const lastValue = this._lastValue; if (lastValue[0] === v0 && lastValue[1] === v1) return; lastValue[0] = v0; lastValue[1] = v1; this._gl.uniform2f(this._location, v0, v1) } Update3f(v0, v1, v2) { v0 = Math.fround(v0); v1 = Math.fround(v1); v2 = Math.fround(v2); const lastValue = this._lastValue; if (lastValue[0] === v0 && lastValue[1] === v1 && lastValue[2] === v2) return; lastValue[0] = v0; lastValue[1] = v1; lastValue[2] = v2; this._gl.uniform3f(this._location, v0, v1, v2) } Update4f(v0, v1, v2, v3) { v0 = Math.fround(v0); v1 = Math.fround(v1); v2 = Math.fround(v2); v3 = Math.fround(v3); const lastValue = this._lastValue; if (lastValue[0] === v0 && lastValue[1] === v1 && lastValue[2] === v2 && lastValue[3] === v3) return; lastValue[0] = v0; lastValue[1] = v1; lastValue[2] = v2; lastValue[3] = v3; this._gl.uniform4f(this._location, v0, v1, v2, v3) } UpdateMatrix4fv(m) { const lastValue = this._lastValue; if (areMat4sEqual(lastValue, m)) return; C3.typedArraySet16(lastValue, m, 0); this._gl.uniformMatrix4fv(this._location, false, m) } IsSetToCustomInBatch(p) { const batchValue = this._lastBatchValue; if (this.IsColorType()) return batchValue[0] === Math.fround(p.getR()) && batchValue[1] === Math.fround(p.getG()) && batchValue[2] === Math.fround(p.getB()); else return batchValue[0] === Math.fround(p) } SetBatchValueCustom(p) { const batchValue = this._lastBatchValue; if (this.IsColorType()) { batchValue[0] = p.getR(); batchValue[1] = p.getG(); batchValue[2] = p.getB() } else batchValue[0] = p } IsSetTo1InBatch(x) { return this._lastBatchValue[0] === Math.fround(x) } IsSetTo2InBatch(x, y) { const batchValue = this._lastBatchValue; return batchValue[0] === Math.fround(x) && batchValue[1] === Math.fround(y) } SetBatch1(x) { this._lastBatchValue[0] = x } SetBatch2(x, y) { const batchValue = this._lastBatchValue; batchValue[0] = x; batchValue[1] = y } } } ;'use strict'; { const C3 = self.C3; const glMatrix = self.glMatrix; const vec4 = glMatrix.vec4; const mat4 = glMatrix.mat4; const BATCH_NULL = 0; const BATCH_QUAD = 1; const BATCH_SETTEXTURE = 2; const BATCH_SETCOLOR = 3; const BATCH_SETBLEND = 4; const BATCH_UPDATEMODELVIEW = 5; const BATCH_SETRENDERTARGET = 6; const BATCH_CLEARSURFACE = 7; const BATCH_CLEARRECT = 8; const BATCH_POINTS = 9; const BATCH_SETPROGRAM = 10; const BATCH_SETPROGRAMPARAMETERS = 11; const BATCH_INVALIDATEFRAMEBUFFER = 12; const BATCH_SETPOINTTEXCOORDS = 13; const BATCH_SETTILEMAPINFO = 14; const BATCH_BLITFRAMEBUFFER = 15; const BATCH_STARTQUERY = 16; const BATCH_ENDQUERY = 17; const BATCH_SETELLIPSEPARAMS = 18; const BATCH_SETGRADIENTCOLOR = 19; C3.Gfx.BatchState = class BatchState { constructor(renderer) { this.renderer = renderer; this.currentMV = mat4.create(); this.currentMatP = mat4.create(); this.currentFramebuffer = null; this.currentColor = vec4.fromValues(1, 1, 1, 1); this.currentShader = null; this.pointTexCoords = new C3.Rect; this.clearColor = C3.New(C3.Color, 0, 0, 0, 0) } } ; C3.Gfx.WebGLBatchJob = class WebGLBatchJob { constructor(batchState) { const arrayBuffer = new ArrayBuffer(96); this._type = 0; this._batchState = batchState; this._gl = batchState.renderer.GetContext(); this._startIndex = 0; this._indexCount = 0; this._texParam = null; this._mat4param = new Float32Array(arrayBuffer,0,16); this._colorParam = new Float32Array(arrayBuffer,64,4); this._srcOriginRect = new Float32Array(arrayBuffer,80,4); this._shaderParams = [] } InitQuad(startIndex, indexCount) { this._type = BATCH_QUAD; this._startIndex = startIndex; this._indexCount = indexCount } DoQuad() { const gl = this._gl; gl.drawElements(gl.TRIANGLES, this._indexCount, gl.UNSIGNED_SHORT, this._startIndex) } InitSetTexture(rendererTex) { this._type = BATCH_SETTEXTURE; this._texParam = rendererTex } DoSetTexture() { const gl = this._gl; const texParam = this._texParam; gl.bindTexture(gl.TEXTURE_2D, texParam ? texParam._GetTexture() : null) } InitSetColor(c) { this._type = BATCH_SETCOLOR; c.writeToTypedArray(this._colorParam, 0) } DoSetColor() { const c = this._colorParam; const batchState = this._batchState; vec4.copy(batchState.currentColor, c); batchState.currentShader.UpdateColor(c) } InitSetGradientColor(c) { this._type = BATCH_SETGRADIENTCOLOR; c.writeToTypedArray(this._colorParam, 0) } DoSetGradientColor() { const c = this._colorParam; const s = this._batchState.currentShader; if (s._uColor2.IsUsed()) s._uColor2.Update4f(c[0], c[1], c[2], c[3]) } InitSetBlend(s, d) { this._type = BATCH_SETBLEND; this._startIndex = s; this._indexCount = d } DoSetBlend() { this._gl.blendFunc(this._startIndex, this._indexCount) } InitUpdateModelView(m) { this._type = BATCH_UPDATEMODELVIEW; mat4.copy(this._mat4param, m) } DoUpdateModelView() { const batchState = this._batchState; const allShaderPrograms = batchState.renderer._allShaderPrograms; const currentShader = batchState.currentShader; const mat4param = this._mat4param; for (let i = 0, len = allShaderPrograms.length; i < len; ++i) { const s = allShaderPrograms[i]; if (s === currentShader) s.UpdateMatMV(mat4param, true); else s.SetMatMVStale() } mat4.copy(batchState.currentMV, mat4param) } InitSetRenderTarget(renderTarget, didSurfaceSizeChange, matP) { this._type = BATCH_SETRENDERTARGET; this._texParam = renderTarget; this._startIndex = didSurfaceSizeChange ? 1 : 0; if (didSurfaceSizeChange) mat4.copy(this._mat4param, matP) } DoSetRenderTarget() { const gl = this._gl; const renderTarget = this._texParam; const didSurfaceSizeChange = this._startIndex !== 0; const matP = this._mat4param; const batchState = this._batchState; const renderer = batchState.renderer; let newViewportWidth, newViewportHeight; if (renderTarget) { const fbo = renderTarget._GetFramebuffer(); batchState.currentFramebuffer = fbo; gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); newViewportWidth = renderTarget.GetWidth(); newViewportHeight = renderTarget.GetHeight() } else { batchState.currentFramebuffer = null; gl.bindFramebuffer(gl.FRAMEBUFFER, null); newViewportWidth = renderer.GetScissoredViewportWidth(); newViewportHeight = renderer.GetScissoredViewportHeight() } if (didSurfaceSizeChange) renderer._UpdateViewportBatch(newViewportWidth, newViewportHeight, matP) } InitClearSurface(c) { this._type = BATCH_CLEARSURFACE; c.writeToTypedArray(this._mat4param, 0) } InitClearSurface2(r, g, b, a) { this._type = BATCH_CLEARSURFACE; const c = this._mat4param; c[0] = r; c[1] = g; c[2] = b; c[3] = a } DoClearSurface() { const gl = this._gl; const mat4param = this._mat4param; const batchState = this._batchState; const renderer = batchState.renderer; const lastClearColor = batchState.clearColor; const debugSkipScissor = renderer._isScissorViewport && C3.isDebug; if (debugSkipScissor) gl.disable(gl.SCISSOR_TEST); const r = mat4param[0]; const g = mat4param[1]; const b = mat4param[2]; const a = mat4param[3]; if (!lastClearColor.equalsRgba(r, g, b, a)) { gl.clearColor(r, g, b, a); lastClearColor.setRgba(r, g, b, a) } gl.clear(gl.COLOR_BUFFER_BIT); if (debugSkipScissor) gl.enable(gl.SCISSOR_TEST) } InitClearRect(x, y, w, h, r, g, b, a) { this._type = BATCH_CLEARRECT; const m = this._mat4param; m[0] = x; m[1] = y; m[2] = w; m[3] = h; m[4] = r; m[5] = g; m[6] = b; m[7] = a } DoClearRectangle() { const gl = this._gl; const mat4param = this._mat4param; const batchState = this._batchState; const renderer = batchState.renderer; const lastClearColor = batchState.clearColor; if (!renderer._isScissorViewport) gl.enable(gl.SCISSOR_TEST); gl.scissor(mat4param[0], mat4param[1], mat4param[2], mat4param[3]); const r = mat4param[4]; const g = mat4param[5]; const b = mat4param[6]; const a = mat4param[7]; if (!lastClearColor.equalsRgba(r, g, b, a)) { gl.clearColor(r, g, b, a); lastClearColor.setRgba(r, g, b, a) } gl.clear(gl.COLOR_BUFFER_BIT); if (!renderer._isScissorViewport) gl.disable(gl.SCISSOR_TEST); else gl.scissor(0, 0, renderer._viewportScissorWidth, renderer._viewportScissorHeight) } InitSetPointTexCoords(rect) { this._type = BATCH_SETPOINTTEXCOORDS; rect.writeToTypedArray(this._mat4param, 0) } DoSetPointTextureCoords() { const mat4param = this._mat4param; this._batchState.pointTexCoords.set(mat4param[0], mat4param[1], mat4param[2], mat4param[3]) } InitPoints(startIndex, z) { this._type = BATCH_POINTS; this._startIndex = startIndex; this._indexCount = 1; this._mat4param[0] = z } DoPoints() { const gl = this._gl; const batchState = this._batchState; const renderer = batchState.renderer; const s = renderer._spPoints; gl.useProgram(s._shaderProgram); s.UpdateMatP(batchState.currentMatP, false); s.UpdateMatMV(batchState.currentMV, false); const ptc = batchState.pointTexCoords; if (s._uPointTexStart.IsUsed()) s._uPointTexStart.Update2f(ptc.getLeft(), ptc.getTop()); if (s._uPointTexEnd.IsUsed()) s._uPointTexEnd.Update2f(ptc.getRight(), ptc.getBottom()); const z = this._mat4param[0]; if (s._uZElevation.IsUsed()) s._uZElevation.Update1f(z); if (s._uColor.IsUsed()) { const c = batchState.currentColor; s._uColor.Update4f(c[0], c[1], c[2], c[3]) } gl.drawArrays(gl.POINTS, this._startIndex / 4, this._indexCount); gl.useProgram(batchState.currentShader._shaderProgram) } InitSetProgram(program) { this._type = BATCH_SETPROGRAM; this._texParam = program } DoSetProgram() { const gl = this._gl; const batchState = this._batchState; const s = this._texParam; batchState.currentShader = s; gl.useProgram(s._shaderProgram); s.UpdateMatP(batchState.currentMatP, false); s.UpdateMatMV(batchState.currentMV, false); if (s._uColor.IsUsed()) { const c = batchState.currentColor; s._uColor.Update4f(c[0], c[1], c[2], c[3]) } } InitSetProgramParameters() { this._type = BATCH_SETPROGRAMPARAMETERS } DoSetProgramParameters() { const s = this._batchState.currentShader; if (s._hasAnyOptionalUniforms) this._DoSetOptionalUniformProgramParameters(s); if (s._uCustomParameters.length) this._DoUpdateCustomProgramParameters(s) } _DoSetOptionalUniformProgramParameters(s) { const gl = this._gl; const mat4param = this._mat4param; const colorParam = this._colorParam; const srcOriginRect = this._srcOriginRect; if (s._uSamplerBack.IsUsed()) { const renderer = this._batchState.renderer; const texParam = this._texParam; if (renderer._lastTexture1 !== texParam) { gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D, texParam ? texParam._GetTexture() : null); renderer._lastTexture1 = texParam; gl.activeTexture(gl.TEXTURE0) } } if (s._uPixelSize.IsUsed()) s._uPixelSize.Update2f(mat4param[0], mat4param[1]); if (s._uDestStart.IsUsed()) s._uDestStart.Update2f(mat4param[2], mat4param[3]); if (s._uDestEnd.IsUsed()) s._uDestEnd.Update2f(mat4param[4], mat4param[5]); if (s._uLayerScale.IsUsed()) s._uLayerScale.Update1f(mat4param[6]); if (s._uLayerAngle.IsUsed()) s._uLayerAngle.Update1f(mat4param[7]); if (s._uSrcStart.IsUsed()) s._uSrcStart.Update2f(mat4param[12], mat4param[13]); if (s._uSrcEnd.IsUsed()) s._uSrcEnd.Update2f(mat4param[14], mat4param[15]); if (s._uSrcOriginStart.IsUsed()) s._uSrcOriginStart.Update2f(srcOriginRect[0], srcOriginRect[1]); if (s._uSrcOriginEnd.IsUsed()) s._uSrcOriginEnd.Update2f(srcOriginRect[2], srcOriginRect[3]); if (s._uLayoutStart.IsUsed()) s._uLayoutStart.Update2f(colorParam[0], colorParam[1]); if (s._uLayoutEnd.IsUsed()) s._uLayoutEnd.Update2f(colorParam[2], colorParam[3]); if (s._uSeconds.IsUsed()) s._uSeconds.Update1f(this._startIndex) } _DoUpdateCustomProgramParameters(s) { const uCustomParameters = s._uCustomParameters; const shaderParams = this._shaderParams; for (let i = 0, len = uCustomParameters.length; i < len; ++i) { const shaderUniform = uCustomParameters[i]; const paramValue = shaderParams[i]; if (shaderUniform.IsColorType()) shaderUniform.Update3f(paramValue.getR(), paramValue.getG(), paramValue.getB()); else shaderUniform.Update1f(paramValue) } } InitInvalidateFramebuffer(fbo) { this._type = BATCH_INVALIDATEFRAMEBUFFER; this._texParam = fbo } DoInvalidateFramebuffer() { const gl = this._gl; const fbo = this._texParam; const lastBoundFbo = this._batchState.currentFramebuffer; if (fbo !== lastBoundFbo) gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.COLOR_ATTACHMENT0]); if (fbo !== lastBoundFbo) gl.bindFramebuffer(gl.FRAMEBUFFER, lastBoundFbo) } InitBlitFramebuffer(sourceRenderTarget, destRenderTarget, mode) { this._type = BATCH_BLITFRAMEBUFFER; const mat4param = this._mat4param; const renderer = this._batchState.renderer; mat4param[0] = sourceRenderTarget.GetWidth(); mat4param[1] = sourceRenderTarget.GetHeight(); mat4param[2] = destRenderTarget ? destRenderTarget.GetWidth() : renderer.GetWidth(); mat4param[3] = destRenderTarget ? destRenderTarget.GetHeight() : renderer.GetHeight(); mat4param[4] = sourceRenderTarget.IsLinearSampling() ? 1 : 0; mat4param[5] = mode === "stretch"; const shaderParams = this._shaderParams; C3.clearArray(shaderParams); shaderParams.push(sourceRenderTarget._GetFramebuffer()); shaderParams.push(destRenderTarget ? destRenderTarget._GetFramebuffer() : null) } DoBlitFramebuffer() { const mat4param = this._mat4param; const shaderParams = this._shaderParams; const gl = this._gl; const srcWidth = mat4param[0]; const srcHeight = mat4param[1]; const destWidth = mat4param[2]; const destHeight = mat4param[3]; const isLinearSampling = mat4param[4] !== 0; const isStretch = mat4param[5] !== 0; const srcFbo = shaderParams[0]; const destFbo = shaderParams[1]; gl.bindFramebuffer(gl.READ_FRAMEBUFFER, srcFbo); gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, destFbo); if (isStretch) gl.blitFramebuffer(0, 0, srcWidth, srcHeight, 0, 0, destWidth, destHeight, gl.COLOR_BUFFER_BIT, isLinearSampling ? gl.LINEAR : gl.NEAREST); else { const w = Math.min(srcWidth, destWidth); const h = Math.min(srcHeight, destHeight); const srcOffY = Math.max(srcHeight - destHeight, 0); const destOffY = Math.max(destHeight - srcHeight, 0); gl.blitFramebuffer(0, srcOffY, w, h + srcOffY, 0, destOffY, w, h + destOffY, gl.COLOR_BUFFER_BIT, gl.NEAREST) } } InitStartQuery(query) { this._type = BATCH_STARTQUERY; this._texParam = query } DoStartQuery() { this._texParam.BeginTimeElapsed(); this._texParam = null } InitEndQuery(query) { this._type = BATCH_ENDQUERY; this._texParam = query } DoEndQuery() { this._texParam.EndTimeElapsed(); this._texParam = null } InitSetEllipseParams(pixelW, pixelH, outlineThickness) { this._type = BATCH_SETELLIPSEPARAMS; const mat4param = this._mat4param; mat4param[0] = pixelW; mat4param[1] = pixelH; mat4param[2] = outlineThickness } DoSetEllipseParams() { const s = this._batchState.currentShader; const mat4param = this._mat4param; if (s._uPixelSize.IsUsed()) s._uPixelSize.Update2f(mat4param[0], mat4param[1]); if (s._uOutlineThickness.IsUsed()) s._uOutlineThickness.Update1f(mat4param[2]) } InitSetTilemapInfo(srcRect, textureWidth, textureHeight, tileWidth, tileHeight, tileSpacingX, tileSpacingY) { this._type = BATCH_SETTILEMAPINFO; const mat4param = this._mat4param; srcRect.writeToTypedArray(mat4param, 0); mat4param[4] = 1 / textureWidth; mat4param[5] = 1 / textureHeight; mat4param[6] = tileWidth / textureWidth; mat4param[7] = tileHeight / textureHeight; mat4param[8] = tileSpacingX / textureWidth; mat4param[9] = tileSpacingY / textureHeight } DoSetTilemapInfo() { const s = this._batchState.currentShader; const mat4param = this._mat4param; if (s._uSrcStart.IsUsed()) s._uSrcStart.Update2f(mat4param[0], mat4param[1]); if (s._uPixelSize.IsUsed()) s._uPixelSize.Update2f(mat4param[4], mat4param[5]); if (s._uTileSize.IsUsed()) s._uTileSize.Update2f(mat4param[6], mat4param[7]); if (s._uTileSpacing.IsUsed()) s._uTileSpacing.Update2f(mat4param[8], mat4param[9]) } Run() { switch (this._type) { case 1: this.DoQuad(); return; case 2: this.DoSetTexture(); return; case 3: this.DoSetColor(); return; case 4: this.DoSetBlend(); return; case 5: this.DoUpdateModelView(); return; case 6: this.DoSetRenderTarget(); return; case 7: this.DoClearSurface(); return; case 8: this.DoClearRectangle(); return; case 9: this.DoPoints(); return; case 10: this.DoSetProgram(); return; case 11: this.DoSetProgramParameters(); return; case 12: this.DoInvalidateFramebuffer(); return; case 13: this.DoSetPointTextureCoords(); return; case 14: this.DoSetTilemapInfo(); return; case 15: this.DoBlitFramebuffer(); return; case 16: this.DoStartQuery(); return; case 17: this.DoEndQuery(); return; case 18: this.DoSetEllipseParams(); return; case 19: this.DoSetGradientColor(); return } } } } ;'use strict'; { const C3 = self.C3; const MAX_TEXTURE_SIZE = 2048; const EXTRA_LINE_HEIGHT = 4; const DEFAULT_OPTS = { timeout: 60 }; const tempColor = new C3.Color(0,0,0,1); const VALID_HORIZ_ALIGNMENTS = new Set(["left", "center", "right"]); const VALID_VERT_ALIGNMENTS = new Set(["top", "center", "bottom"]); const VALID_WORD_WRAP_MODES = new Set(["word", "character"]); const allRendererTexts = new Set; if (C3.FontManager) C3.FontManager.addEventListener("fontload", e=>{ const fontName = e.font.GetName(); for (const f of allRendererTexts) if (f.IsBBCodeEnabled() || C3.equalsNoCase(f.GetFontName(), fontName)) f._SetTextChanged() } ); function fillOrStrokeText(ctx, isStroke, text, x, y, maxWidth) { if (isStroke) if (C3.Platform.BrowserEngine === "Gecko") ctx.strokeText(text, x, y, maxWidth); else ctx.strokeText(text, x, y); else if (C3.Platform.BrowserEngine === "Gecko") ctx.fillText(text, x, y, maxWidth); else ctx.fillText(text, x, y) } function fillOrStrokeRect(ctx, isStroke, x, y, w, h) { if (isStroke) ctx.strokeRect(x, y, w, h); else ctx.fillRect(x, y, w, h) } function ptToPx(pt) { return pt * (4 / 3) } C3.Gfx.RendererText = class RendererText { constructor(renderer, opts) { opts = Object.assign({}, DEFAULT_OPTS, opts); this._renderer = renderer; this._fontName = "Arial"; this._fontSize = 16; this._lineHeight = 0; this._isBold = false; this._isItalic = false; this._colorStr = "black"; this._isBBcodeEnabled = false; this.onloadfont = null; this._alreadyLoadedFonts = new Set; this._horizontalAlign = "left"; this._verticalAlign = "top"; this._text = ""; this._bbString = null; this._wrappedText = C3.New(C3.WordWrap); this._wrapMode = "word"; this._textChanged = false; this._isUpdating = false; this._isAsync = true; this._drawMaxCharCount = -1; this._drawCharCount = 0; this._cssWidth = 0; this._cssHeight = 0; this._width = 0; this._height = 0; this._zoom = 1; this._changed = false; this._textCanvas = null; this._textContext = null; this._measureContext = null; this._lastCanvasWidth = -1; this._lastCanvasHeight = -1; this._lastTextCanvasFont = ""; this._lastMeasureCanvasFont = ""; this._lastTextCanvasFillStyle = ""; this._lastTextCanvasOpacity = 1; this._lastTextCanvasLineWidth = 1; this._measureTextCallback = (text,styles)=>this._MeasureText(text, styles); this._texture = null; this._textureWidth = 0; this._textureHeight = 0; this._rcTex = new C3.Rect; this._scaleFactor = 1; this._needToRecreateTexture = false; this._textureTimeout = new C3.IdleTimeout(()=>{ this.ReleaseTexture(); this._SetTextCanvasSize(8, 8) } ,opts.timeout); this.ontextureupdate = null; this._wasReleased = false; allRendererTexts.add(this) } Release() { this.onloadfont = null; this._alreadyLoadedFonts.clear(); this._bbString = null; this._textCanvas = null; this._textContext = null; this._measureContext = null; this._measureTextCallback = null; this._textureTimeout.Release(); this.ontextureupdate = null; this.ReleaseTexture(); this._wrappedText.Clear(); this._wrappedText = null; this._renderer = null; this._wasReleased = true; allRendererTexts.delete(this) } _SetChanged() { this._changed = true } _SetTextChanged() { this._SetChanged(); this._wrappedText.Clear(); this._textChanged = true } SetIsAsync(a) { this._isAsync = !!a } IsAsync() { return this._isAsync } SetBBCodeEnabled(e) { e = !!e; if (this._isBBcodeEnabled === e) return; this._isBBcodeEnabled = e; if (this._textContext) this._textContext.textBaseline = this._isBBcodeEnabled ? "alphabetic" : "top"; this._SetTextChanged() } IsBBCodeEnabled() { return this._isBBcodeEnabled } SetFontName(fontName) { if (!fontName) fontName = "serif"; if (this._fontName === fontName) return; this._fontName = fontName; this._SetTextChanged() } GetFontName() { return this._fontName } SetFontSize(fontSize) { if (fontSize < .1) fontSize = .1; if (this._fontSize === fontSize) return; this._fontSize = fontSize; this._SetTextChanged() } SetLineHeight(h) { if (this._lineHeight === h) return; this._lineHeight = h; this._SetChanged() } SetBold(bold) { bold = !!bold; if (this._isBold === bold) return; this._isBold = bold; this._SetTextChanged() } SetItalic(italic) { italic = !!italic; if (this._isItalic === italic) return; this._isItalic = italic; this._SetTextChanged() } SetDrawMaxCharacterCount(n) { n = Math.floor(n); if (this._drawMaxCharCount === n) return; this._drawMaxCharCount = n; this._SetChanged() } GetDrawMaxCharacterCount() { return this._drawMaxCharCount } _GetStyleTag(styles, tag) { for (let i = styles.length - 1; i >= 0; --i) { const s = styles[i]; if (s.tag === tag) return s } return null } _HasStyleTag(styles, tag) { return !!this._GetStyleTag(styles, tag) } _GetFontString(useCssUnits, styles) { let ret = ""; if (this._isBold || this._HasStyleTag(styles, "b")) ret += "bold"; if (this._isItalic || this._HasStyleTag(styles, "i")) ret += " italic"; const sizeStyle = this._GetStyleTag(styles, "size"); const fontSize = sizeStyle ? parseFloat(sizeStyle.param) : this._fontSize; if (useCssUnits) ret += " " + fontSize + "pt"; else ret += " " + fontSize * this._scaleFactor * this._zoom * self.devicePixelRatio + "pt"; let fontName = this._fontName; const fontStyle = this._GetStyleTag(styles, "font"); if (fontStyle && fontStyle.param) { fontName = fontStyle.param; if (this.onloadfont && !this._alreadyLoadedFonts.has(fontName)) { this.onloadfont(fontName); this._alreadyLoadedFonts.add(fontName) } } if (fontName) ret += ' "' + fontName + '"'; return ret } SetColor(c) { if (c instanceof C3.Color) c = c.getCssRgb(); if (this._colorStr === c) return; this._colorStr = c; this._SetChanged() } SetColorRgb(r, g, b) { tempColor.setRgb(r, g, b); this.SetColor(tempColor) } SetHorizontalAlignment(h) { if (!VALID_HORIZ_ALIGNMENTS.has(h)) throw new Error("invalid horizontal alignment"); if (this._horizontalAlign === h) return; this._horizontalAlign = h; this._SetChanged() } SetVerticalAlignment(v) { if (!VALID_VERT_ALIGNMENTS.has(v)) throw new Error("invalid vertical alignment"); if (this._verticalAlign === v) return; this._verticalAlign = v; this._SetChanged() } SetWordWrapMode(m) { if (!VALID_WORD_WRAP_MODES.has(m)) throw new Error("invalid word wrap mode"); if (this._wrapMode === m) return; this._wrapMode = m; this._SetTextChanged() } SetText(text) { if (this._text === text) return; this._text = text; this._SetTextChanged() } SetSize(cssWidth, cssHeight, zoom) { if (typeof zoom === "undefined") zoom = 1; if (cssWidth <= 0 || cssWidth <= 0) return; if (this._cssWidth === cssWidth && this._cssHeight === cssHeight && this._zoom === zoom) return; if (this._zoom === 1 !== (zoom === 1)) this._needToRecreateTexture = true; const oldCssWidth = this._cssWidth; const oldZoom = this._zoom; this._cssWidth = cssWidth; this._cssHeight = cssHeight; this._zoom = zoom; const dpr = self.devicePixelRatio; this._width = this._cssWidth * this._zoom * dpr; this._height = this._cssHeight * this._zoom * dpr; const maxDim = Math.max(this._width, this._height); const maxTextureSize = Math.min(this._renderer.GetMaxTextureSize(), MAX_TEXTURE_SIZE); let scale = 1; if (maxDim > maxTextureSize) { scale = maxTextureSize / maxDim; this._width = Math.min(this._width * scale, maxTextureSize); this._height = Math.min(this._height * scale, maxTextureSize) } this._scaleFactor = scale; if (this._textureWidth > 0 && this._textureHeight > 0 && this._zoom === oldZoom) this._rcTex.set(0, 0, this._width / this._textureWidth, this._height / this._textureHeight); if (this._cssWidth !== oldCssWidth) this._SetTextChanged(); else this._SetChanged() } GetWidth() { return this._width } GetHeight() { return this._height } GetTextWidth() { this._MaybeWrapText(); return this._wrappedText.GetMaxLineWidth() } GetTextHeight() { this._MaybeWrapText(); return this._wrappedText.GetTotalLineHeight() + this._wrappedText.GetLineCount() * (this._lineHeight + EXTRA_LINE_HEIGHT) - this._lineHeight } GetTexture() { this._textureTimeout.Reset(); this._MaybeUpdate(); return this._texture } _MaybeUpdate() { if (this._texture && !this._changed && !this._textChanged) return; if (this._isUpdating) return; if (this._width <= 0 || this._height <= 0) return; this._changed = false; this._isUpdating = true; if (this._isAsync) C3.Asyncify(()=>this._DoUpdate()); else this._DoUpdate() } _DoUpdate() { if (this._wasReleased) return; this._SetTextCanvasSize(Math.ceil(this._width), Math.ceil(this._height)); this._MaybeWrapText(); this._DrawTextToCanvas(); this._UpdateTexture(); this._textureTimeout.Reset(); this._isUpdating = false } _SetTextCanvasSize(w, h) { if (!this._textCanvas) this._textCanvas = C3.CreateCanvas(16, 16); let wasReset = false; if (this._lastCanvasWidth !== w || this._lastCanvasHeight !== h) { this._lastCanvasWidth = w; this._lastCanvasHeight = h; this._textCanvas.width = w; this._textCanvas.height = h; wasReset = true } if (!this._textContext) { this._textContext = this._textCanvas.getContext("2d"); wasReset = true } if (wasReset) { this._textContext.textBaseline = this._isBBcodeEnabled ? "alphabetic" : "top"; this._textContext.font = this._lastTextCanvasFont; this._textContext.fillStyle = this._lastTextCanvasFillStyle; this._textContext.strokeStyle = this._lastTextCanvasFillStyle; this._textContext.globalAlpha = this._lastTextCanvasOpacity; this._textContext.lineWidth = this._lastTextCanvasLineWidth } else this._textContext.clearRect(0, 0, w, h) } _MaybeCreateMeasureContext() { if (this._measureContext) return; this._measureContext = C3.CreateCanvas(16, 16).getContext("2d") } _SetMeasureFontString(fontString) { if (this._lastMeasureCanvasFont === fontString) return; this._lastMeasureCanvasFont = fontString; this._measureContext.font = fontString } _MaybeWrapText() { if (!this._textChanged) return; this._MaybeCreateMeasureContext(); if (this._isBBcodeEnabled && (!this._bbString || this._bbString.toString() !== this._text)) this._bbString = new C3.BBString(this._text,{ noEscape: true }); this._wrappedText.WordWrap(this._isBBcodeEnabled ? this._bbString.toFragmentList() : this._text, this._measureTextCallback, this._cssWidth, this._wrapMode, 0); this._textChanged = false } _MeasureText(text, styles) { this._SetMeasureFontString(this._GetFontString(true, styles)); const sizeStyle = this._GetStyleTag(styles, "size"); const fontSize = sizeStyle ? parseFloat(sizeStyle.param) : this._fontSize; return { width: this._measureContext.measureText(text).width, height: ptToPx(fontSize) } } _SetDrawFontString(fontString) { if (this._lastTextCanvasFont === fontString) return; this._lastTextCanvasFont = fontString; this._textContext.font = fontString } _SetDrawCanvasColor(styleStr) { if (this._lastTextCanvasFillStyle === styleStr) return; this._lastTextCanvasFillStyle = styleStr; this._textContext.fillStyle = styleStr; this._textContext.strokeStyle = styleStr } _SetDrawCanvasOpacity(o) { if (this._lastTextCanvasOpacity === o) return; this._lastTextCanvasOpacity = o; this._textContext.globalAlpha = o } _SetDrawCanvasLineWith(w) { if (this._lastTextCanvasLineWidth === w) return; this._lastTextCanvasLineWidth = w; this._textContext.lineWidth = w } _DrawTextToCanvas() { this._drawCharCount = 0; const scale = this._scaleFactor * this._zoom * self.devicePixelRatio; const lineSpaceHeight = (EXTRA_LINE_HEIGHT + this._lineHeight) * scale; let penY = 0; const lines = this._wrappedText.GetLines(); const linesTotalHeight = lines.reduce((a,v)=>a + v.height * scale + lineSpaceHeight, 0) - this._lineHeight * scale; if (this._verticalAlign === "center") penY = Math.max(this._height / 2 - linesTotalHeight / 2, 0); else if (this._verticalAlign === "bottom") penY = this._height - linesTotalHeight - 2; for (let i = 0, len = lines.length; i < len; ++i) { const line = lines[i]; const curLineTextHeight = line.height * scale; const startPenY = penY; if (this._isBBcodeEnabled) { penY += curLineTextHeight; if (i > 0 && penY > this._height - EXTRA_LINE_HEIGHT * scale) break } else if (i > 0 && penY >= this._height - curLineTextHeight) break; if (startPenY >= 0) this._DrawTextLine(line, penY, scale); if (!this._isBBcodeEnabled) penY += curLineTextHeight; penY += lineSpaceHeight } } _DrawTextLine(line, penY, scale) { let penX = 0; if (this._horizontalAlign === "center") penX = (this._width - line.width * scale) / 2; else if (this._horizontalAlign === "right") penX = this._width - line.width * scale; for (const frag of line.fragments) { this._DrawTextFragment(frag, penX, penY, scale, line.height); penX += frag.width * scale } } _DrawTextFragment(frag, penX, penY, scale, lineHeight) { const textContext = this._textContext; const lineFontScale = lineHeight / 16; let fragWidth = frag.width * scale; const fragHeight = frag.height * scale; const fragFontScale = frag.height / 16; const lineSpaceHeight = (EXTRA_LINE_HEIGHT + this._lineHeight) * scale; const styles = frag.styles; let text = frag.text; if (this._drawMaxCharCount !== -1) { if (this._drawCharCount >= this._drawMaxCharCount) return; if (this._drawCharCount + text.length > this._drawMaxCharCount) { text = text.substr(0, this._drawMaxCharCount - this._drawCharCount); fragWidth = this._MeasureText(text, styles).width * scale } this._drawCharCount += text.length } const backgroundStyle = this._GetStyleTag(styles, "background"); const hasUnderline = this._HasStyleTag(styles, "u"); const hasStrikethrough = this._HasStyleTag(styles, "s"); if (C3.IsStringAllWhitespace(text) && !backgroundStyle && !hasUnderline && !hasStrikethrough || this._HasStyleTag(styles, "hide")) return; const offsetXStyle = this._GetStyleTag(styles, "offsetx"); penX += offsetXStyle ? parseFloat(offsetXStyle.param) * scale : 0; const offsetYStyle = this._GetStyleTag(styles, "offsety"); penY += offsetYStyle ? parseFloat(offsetYStyle.param) * scale : 0; if (backgroundStyle) { this._SetDrawCanvasColor(backgroundStyle.param); textContext.fillRect(penX, penY - fragHeight, fragWidth, fragHeight + lineSpaceHeight) } const colorStyle = this._GetStyleTag(styles, "color"); this._SetDrawCanvasColor(colorStyle ? colorStyle.param : this._colorStr); const opacityStyle = this._GetStyleTag(styles, "opacity"); this._SetDrawCanvasOpacity(opacityStyle ? parseFloat(opacityStyle.param) / 100 : 1); const isStroke = this._HasStyleTag(styles, "stroke"); if (isStroke) this._SetDrawCanvasLineWith(fragFontScale * this._scaleFactor * this._zoom); if (hasUnderline) fillOrStrokeRect(textContext, isStroke, penX, penY + scale * lineFontScale, fragWidth, scale * lineFontScale); if (hasStrikethrough) fillOrStrokeRect(textContext, isStroke, penX, penY - fragHeight / 4, fragWidth, scale * fragFontScale); this._SetDrawFontString(this._GetFontString(false, styles)); fillOrStrokeText(textContext, isStroke, text, penX, penY, fragWidth); if (!isStroke) { this._SetDrawCanvasLineWith(fragFontScale * this._scaleFactor * this._zoom); const outlineStyle = this._GetStyleTag(styles, "outline"); if (outlineStyle) { this._SetDrawCanvasColor(outlineStyle.param); fillOrStrokeText(textContext, true, text, penX, penY, fragWidth) } } } _UpdateTexture() { if (this._renderer.IsContextLost()) return; this._textureWidth = Math.ceil(this._width); this._textureHeight = Math.ceil(this._height); this._rcTex.set(0, 0, this._width / this._textureWidth, this._height / this._textureHeight); if (this._needToRecreateTexture) { this.ReleaseTexture(); this._needToRecreateTexture = false } if (!this._texture) this._texture = this._renderer.CreateDynamicTexture(this._textureWidth, this._textureHeight, { mipMap: this._zoom === 1, mipMapQuality: "high" }); this._renderer.UpdateTexture(this._textCanvas, this._texture); if (this.ontextureupdate) this.ontextureupdate() } GetTexRect() { return this._rcTex } ReleaseTexture() { if (this._texture) { if (!this._renderer.IsContextLost()) this._renderer.DeleteTexture(this._texture); this._texture = null } } static OnContextLost() { for (const rendererText of allRendererTexts) rendererText.ReleaseTexture() } static GetAll() { return allRendererTexts.values() } } } ;'use strict'; { const C3 = self.C3; class WebGLRealTimeElapsedQuery { constructor(renderer) { this._gl = renderer.GetContext(); this._version = renderer.GetWebGLVersionNumber(); this._timerExt = renderer._GetDisjointTimerQueryExtension(); this._query = null; this._isActive = false; this._hasResult = false; this._result = 0; if (this._version === 1) this._query = this._timerExt["createQueryEXT"](); else this._query = this._gl["createQuery"]() } Release() { this._DeleteQueryObject(); this._gl = null; this._timerExt = null; this._hasResult = false } _DeleteQueryObject() { if (!this._query) return; if (this._version === 1) this._timerExt["deleteQueryEXT"](this._query); else this._gl["deleteQuery"](this._query); this._query = null } BeginTimeElapsed() { if (this._isActive) throw new Error("query already active"); if (this._version === 1) this._timerExt["beginQueryEXT"](this._timerExt["TIME_ELAPSED_EXT"], this._query); else this._gl["beginQuery"](this._timerExt["TIME_ELAPSED_EXT"], this._query); this._isActive = true } EndTimeElapsed() { if (!this._isActive) throw new Error("query not active"); if (this._version === 1) this._timerExt["endQueryEXT"](this._timerExt["TIME_ELAPSED_EXT"]); else this._gl["endQuery"](this._timerExt["TIME_ELAPSED_EXT"]); this._isActive = false } CheckForResult() { if (!this._query || this._hasResult || this._isActive) return; let available = false; if (this._version === 1) available = this._timerExt["getQueryObjectEXT"](this._query, this._timerExt["QUERY_RESULT_AVAILABLE_EXT"]); else available = this._gl["getQueryParameter"](this._query, this._gl["QUERY_RESULT_AVAILABLE"]); const disjoint = this._gl.getParameter(this._timerExt["GPU_DISJOINT_EXT"]); if (available && !disjoint) { if (this._version === 1) this._result = this._timerExt["getQueryObjectEXT"](this._query, this._timerExt["QUERY_RESULT_EXT"]); else this._result = this._gl["getQueryParameter"](this._query, this._gl["QUERY_RESULT"]); this._result /= 1E9; this._hasResult = true } if (available || disjoint) this._DeleteQueryObject() } HasResult() { return this._hasResult } GetResult() { if (!this._hasResult) throw new Error("no result available"); return this._result } } C3.Gfx.WebGLTimeElapsedQuery = class WebGLTimeElapsedQuery { constructor(renderer) { this._renderer = renderer; this._frameNumber = renderer.GetFrameNumber(); this._isActive = false; this._parentQuery = null; this._isNested = false; this._realQuery = null; this._queries = [] } Release() { for (const q of this._queries) if (q instanceof WebGLRealTimeElapsedQuery) q.Release(); C3.clearArray(this._queries); this._parentQuery = null; this._realQuery = null; this._renderer = null } BeginTimeElapsed() { if (this._isActive) throw new Error("query already active"); const stack = this._renderer._GetTimeQueryStack(); if (stack.length > 0) { this._isNested = true; this._parentQuery = stack[stack.length - 1]; this._parentQuery._EndReal(); this._parentQuery._queries.push(this) } else { this._isNested = false; this._parentQuery = null } this._isActive = true; stack.push(this); this._StartReal() } EndTimeElapsed() { if (!this._isActive) throw new Error("query not active"); const top = this._renderer._GetTimeQueryStack().pop(); if (top !== this) throw new Error("can only end most nested query"); this._isActive = false; this._EndReal(); if (this._parentQuery) { this._parentQuery._StartReal(); this._parentQuery = null } } _StartReal() { this._realQuery = C3.New(WebGLRealTimeElapsedQuery, this._renderer); this._queries.push(this._realQuery); this._realQuery.BeginTimeElapsed() } _EndReal() { this._realQuery.EndTimeElapsed(); this._realQuery = null } CheckForResult() { for (const q of this._queries) q.CheckForResult() } IsNested() { return this._isNested } HasResult() { return this._queries.every(q=>q.HasResult()) } GetResult() { return this._queries.reduce((a,v)=>a + v.GetResult(), 0) } GetFrameNumber() { return this._frameNumber } } } ;'use strict'; { const C3 = self.C3; C3.Gfx.WebGLQueryResultBuffer = class WebGLQueryResultBuffer { constructor(renderer, maxQueries=1E3) { this._renderer = renderer; this._maxQueries = maxQueries; this._buffer = []; this._renderer._AddQueryResultBuffer(this) } Release() { this.Clear(); this._renderer._RemoveQueryResultBuffer(this); this._renderer = null } Clear() { for (const q of this._buffer) q.Release(); C3.clearArray(this._buffer) } AddTimeElapsedQuery() { const ret = new C3.Gfx.WebGLTimeElapsedQuery(this._renderer); this._buffer.push(ret); if (this._buffer.length > this._maxQueries) { const oldest = this._buffer.shift(); oldest.Release() } return ret } CheckForResults(toFrameNumber) { for (const q of this._buffer) { if (q.GetFrameNumber() >= toFrameNumber) return; if (q.IsNested()) return; q.CheckForResult() } } GetFrameRangeResultSum(startFrame, endFrame) { if (endFrame <= startFrame) return NaN; let sum = 0; for (const q of this._buffer) { if (q.GetFrameNumber() >= endFrame) break; if (q.GetFrameNumber() < startFrame) continue; if (q.HasResult()) sum += q.GetResult(); else return NaN } return sum } DeleteAllBeforeFrameNumber(frameNumber) { for (let i = 0, len = this._buffer.length; i < len; ++i) { const q = this._buffer[i]; if (q.GetFrameNumber() < frameNumber) q.Release(); else { if (i > 0) this._buffer.splice(0, i); return } } } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; const glMatrix = self.glMatrix; const vec3 = glMatrix.vec3; const vec4 = glMatrix.vec4; const mat4 = glMatrix.mat4; const DEFAULT_WEBGLRENDERER_OPTS = { powerPreference: "default", enableGpuProfiling: true, alpha: false, lowLatency: false, maxWebGLVersion: 2 }; const VALID_POWER_PREFERENCES = new Set(["default", "low-power", "high-performance"]); const MAX_VERTICES = 8E3; const MAX_INDICES = MAX_VERTICES / 2 * 3; const MAX_POINTS = 8E3; const LAST_POINT = MAX_POINTS - 4; const PARTIAL_TEXTURE_UPLOAD_CHUNK_SIZE = 256 * 1024; function areMat4sEqual(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15] } const defaultTexCoordsQuad = new C3.Quad(0,0,1,0,1,1,0,1); const tmpVec3 = vec3.fromValues(0, 0, 0); const tmpVec3b = vec3.fromValues(0, 0, 0); const tmpMat4 = mat4.create(); const tmpQuad = new C3.Quad; const tmpRect = new C3.Rect; let loseContextExtension = null; if (C3.isDebug) { self.debug_lose_context = function() { if (!loseContextExtension) { console.warn("WEBGL_lose_context not supported"); return } loseContextExtension.loseContext() } ; self.debug_restore_context = function() { if (!loseContextExtension) { console.warn("WEBGL_lose_context not supported"); return } loseContextExtension.restoreContext() } } const pendingPolls = new Set; let pollRafId = -1; function CheckPendingPolls() { pollRafId = -1; for (const info of pendingPolls) if (info.checkFunc()) { info.resolve(); pendingPolls.delete(info) } if (pendingPolls.size > 0) pollRafId = self.requestAnimationFrame(CheckPendingPolls) } function GetWebGLContext(canvas, attribs, maxWebGLVersion) { let gl = null; if (maxWebGLVersion >= 2) { gl = canvas.getContext("webgl2", attribs); if (gl) return { gl, version: 2 } } gl = canvas.getContext("webgl", attribs); if (!gl) try { gl = canvas.getContext("experimental-webgl", attribs) } catch (err) { console.warn("Error requesting 'experimental-webgl' context: ", err) } return { gl, version: 1 } } C3.Gfx.WebGLRenderer = class WebGLRenderer extends C3.Gfx.RendererBase { constructor(canvas, opts) { super(); opts = Object.assign({}, DEFAULT_WEBGLRENDERER_OPTS, opts); if (!VALID_POWER_PREFERENCES.has(opts.powerPreference)) throw new Error("invalid power preference"); let hasMajorPerformanceCaveat = false; const attribs = { "alpha": !!opts.alpha, "depth": false, "antialias": false, "powerPreference": opts.powerPreference, "failIfMajorPerformanceCaveat": true }; if (opts.lowLatency) { attribs["desynchronized"] = true; attribs["preserveDrawingBuffer"] = true } let ctxInfo = GetWebGLContext(canvas, attribs, opts.maxWebGLVersion); if (!ctxInfo.gl) { hasMajorPerformanceCaveat = true; attribs["failIfMajorPerformanceCaveat"] = false; ctxInfo = GetWebGLContext(canvas, attribs, opts.maxWebGLVersion) } if (!ctxInfo.gl) throw new Error("failed to initialise WebGL context"); const gl = ctxInfo.gl; this._gl = gl; this._attribs = gl.getContextAttributes(); if (opts.lowLatency && !this._attribs["desynchronized"]) console.info("[WebGLRenderer] Low-latency mode specified but is not supported here"); this._versionString = gl.getParameter(gl.VERSION); this._version = ctxInfo.version; this._is3d = true; this._lastBackbufferWidth = 0; this._lastBackbufferHeight = 0; this._vertexBuffer = null; this._texcoordBuffer = null; this._indexBuffer = null; this._pointBuffer = null; this._vertexData = new Float32Array(MAX_VERTICES * this.GetNumVertexComponents()); this._indexData = new Uint16Array(MAX_INDICES); this._texcoordData = new Float32Array(MAX_VERTICES * 2); this._pointData = new Float32Array(MAX_POINTS * 4); this._vertexPtr = 0; this._texPtr = 0; this._pointPtr = 0; this._lastVertexPtr = 0; this._lastProgram = null; this._spDeviceTransformTextureFill = null; this._spColorFill = null; this._spLinearGradientFill = null; this._spHardEllipseFill = null; this._spHardEllipseOutline = null; this._spSmoothEllipseFill = null; this._spSmoothEllipseOutline = null; this._spSmoothLineFill = null; this._spPoints = null; this._spTilemapFill = null; this._batch = []; this._batchPtr = 0; this._topOfBatch = 0; this._currentRenderTarget = null; this._baseZ = 0; this._currentZ = 0; this._lastPointZ = 0; this._batchState = C3.New(C3.Gfx.BatchState, this); this._lastColor = C3.New(C3.Color, 1, 1, 1, 1); this._lastTexture0 = null; this._lastTexture1 = null; this._lastSrcBlend = 0; this._lastDestBlend = 0; this._lineWidth = 1; this._lineWidthStack = [this._lineWidth]; this._lineCap = 1; this._lineCapStack = [this._lineCap]; this._lineOffset = .5; this._lineOffsetStack = [this._lineOffset]; this._isScissorViewport = false; this._viewportScissorWidth = -1; this._viewportScissorHeight = -1; this._lastPointTexCoords = new C3.Rect; this._maxTextureSize = -1; this._minPointSize = 0; this._maxPointSize = 0; this._highpPrecision = 0; this._unmaskedVendor = "(unavailable)"; this._unmaskedRenderer = "(unavailable)"; this._extensions = []; this._hasMajorPerformanceCaveat = hasMajorPerformanceCaveat; this._isInitialisingAfterContextRestored = false; this._parallelShaderCompileExt = null; this._isGpuProfilingEnabled = !!opts.enableGpuProfiling; this._timerExt = null; this._allQueryResultBuffers = new Set; this._timeQueryStack = []; this.FillIndexBufferData(this._indexData) } async InitState() { const gl = this._gl; const numVertexComponents = this.GetNumVertexComponents(); this._lastColor.setRgba(1, 1, 1, 1); this._lastTexture0 = null; this._lastTexture1 = null; this._vertexPtr = 0; this._pointPtr = 0; this._lastVertexPtr = MAX_VERTICES * numVertexComponents - 4 * numVertexComponents; C3.clearArray(this._batch); this._batchPtr = 0; this._topOfBatch = 0; this._lastProgram = null; this._currentRenderTarget = null; this._lastPointTexCoords.set(0, 0, 1, 1); this._baseZ = 0; this._currentZ = 0; this._lastPointZ = 0; const batchState = this._batchState; batchState.currentShader = null; batchState.currentFramebuffer = null; vec4.set(batchState.currentColor, 1, 1, 1, 1); batchState.clearColor.setRgba(0, 0, 0, 0); batchState.pointTexCoords.set(0, 0, 1, 1); gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT); gl.enable(gl.BLEND); gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); this._lastSrcBlend = gl.ONE; this._lastDestBlend = gl.ONE_MINUS_SRC_ALPHA; this._InitBlendModes(gl); gl.disable(gl.CULL_FACE); gl.disable(gl.STENCIL_TEST); gl.disable(gl.DITHER); gl.disable(gl.DEPTH_TEST); this._pointBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this._pointBuffer); gl.bufferData(gl.ARRAY_BUFFER, this._pointData.byteLength, gl.DYNAMIC_DRAW); this._vertexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this._vertexData.byteLength, gl.DYNAMIC_DRAW); this._texcoordBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this._texcoordBuffer); gl.bufferData(gl.ARRAY_BUFFER, this._texcoordData.byteLength, gl.DYNAMIC_DRAW); this._indexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._indexData, gl.STATIC_DRAW); gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, null); this._maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); const pointsizes = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE); this._minPointSize = pointsizes[0]; this._maxPointSize = pointsizes[1]; const highpVertex = gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT); const highpFrag = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT); if (highpVertex && highpFrag) this._highpPrecision = Math.min(highpVertex["precision"], highpFrag["precision"]); else this._highpPrecision = 0; if (this._maxPointSize > 2048) this._maxPointSize = 2048; this._extensions = gl.getSupportedExtensions(); const debug_ext = gl.getExtension("WEBGL_debug_renderer_info"); if (debug_ext) { this._unmaskedVendor = gl.getParameter(debug_ext["UNMASKED_VENDOR_WEBGL"]); this._unmaskedRenderer = gl.getParameter(debug_ext["UNMASKED_RENDERER_WEBGL"]) } this._parallelShaderCompileExt = gl.getExtension("KHR_parallel_shader_compile"); if (C3.isDebug) loseContextExtension = gl.getExtension("WEBGL_lose_context"); if (this._isGpuProfilingEnabled) if (this.GetWebGLVersionNumber() === 1) { if (C3.Platform.BrowserEngine !== "Chromium" || C3.Platform.BrowserVersionNumber >= 81 || typeof document !== "undefined") this._timerExt = gl.getExtension("EXT_disjoint_timer_query") } else this._timerExt = gl.getExtension("EXT_disjoint_timer_query_webgl2") || gl.getExtension("EXT_disjoint_timer_query"); this._ClearAllShaderPrograms(); const WebGLShaderProgram = C3.Gfx.WebGLShaderProgram; const vsSource = WebGLShaderProgram.GetDefaultVertexShaderSource(this._is3d, false); const DEFAULT_SHADER_PROGRAMS = [[WebGLShaderProgram.GetTextureFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetTextureFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetPointFragmentShaderSource(), WebGLShaderProgram.GetPointVertexShaderSource(), ""], [WebGLShaderProgram.GetColorFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetLinearGradientFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetHardEllipseFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetHardEllipseOutlineFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetSmoothEllipseFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetSmoothEllipseOutlineFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetSmoothLineFillFragmentShaderSource(), vsSource, ""], [WebGLShaderProgram.GetTilemapFragmentShaderSource(), WebGLShaderProgram.GetDefaultVertexShaderSource(this._is3d, true), ""]]; const defaultShaders = await Promise.all(DEFAULT_SHADER_PROGRAMS.map(i=>this.CreateShaderProgram({ src: i[0] }, i[1], i[2]))); this._spTextureFill = defaultShaders[0]; this._spDeviceTransformTextureFill = defaultShaders[1]; this._spPoints = defaultShaders[2]; this._spColorFill = defaultShaders[3]; this._spLinearGradientFill = defaultShaders[4]; this._spHardEllipseFill = defaultShaders[5]; this._spHardEllipseOutline = defaultShaders[6]; this._spSmoothEllipseFill = defaultShaders[7]; this._spSmoothEllipseOutline = defaultShaders[8]; this._spSmoothLineFill = defaultShaders[9]; this._spTilemapFill = defaultShaders[10]; this._currentStateGroup = null; this.SetTextureFillMode() } Is3D() { return this._is3d } GetNumVertexComponents() { return this._is3d ? 3 : 2 } SetBaseZ(z) { this._baseZ = z } GetBaseZ() { return this._baseZ } SetCurrentZ(z) { this._currentZ = z; this._currentStateGroup = null } GetCurrentZ() { return this._currentZ } async CreateShaderProgram(shaderInfo, vsSource, name) { const ret = await C3.Gfx.WebGLShaderProgram.Create(this, shaderInfo, vsSource, name); this._AddShaderProgram(ret); return ret } ResetLastProgram() { this._lastProgram = null } SetSize(w, h, force) { if (this._width === w && this._height === h && !force) return; this.EndBatch(); const gl = this._gl; const batchState = this._batchState; this._width = w; this._height = h; const viewW = this.GetScissoredViewportWidth(); const viewH = this.GetScissoredViewportHeight(); this._UpdateViewportRenderer(viewW, viewH, this._width, this._height); this._UpdateViewportBatch(viewW, viewH, this._matP); if (this._spDeviceTransformTextureFill) { gl.useProgram(this._spDeviceTransformTextureFill.GetShaderProgram()); this._spDeviceTransformTextureFill._UpdateDeviceTransformUniforms(this._matP); this._lastProgram = this._spDeviceTransformTextureFill; this._batchState.currentShader = this._spDeviceTransformTextureFill } gl.bindTexture(gl.TEXTURE_2D, null); gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D, null); gl.activeTexture(gl.TEXTURE0); this._lastTexture0 = null; this._lastTexture1 = null; if (this._currentRenderTarget) this._currentRenderTarget._Resize(this._width, this._height); gl.bindFramebuffer(gl.FRAMEBUFFER, null); this._currentRenderTarget = null; batchState.currentFramebuffer = null } _UpdateViewportRenderer(viewW, viewH, surfaceW, surfaceH) { this._cam[2] = 100; mat4.lookAt(this._matMV, this._cam, this._look, this._up); mat4.perspective(this._matP, 45, viewW / viewH, this.GetNearZ(), this.GetFarZ()); const tl = [0, 0]; const br = [0, 0]; const dpr = self.devicePixelRatio; this.Project(0, 0, viewW, viewH, tl); this.Project(1, 1, viewW, viewH, br); this._worldScale[0] = dpr / (br[0] - tl[0]); this._worldScale[1] = -dpr / (br[1] - tl[1]); this._lastBackbufferWidth = surfaceW; this._lastBackbufferHeight = surfaceH } _UpdateViewportBatch(viewW, viewH, matP) { const gl = this._gl; const batchState = this._batchState; gl.viewport(0, 0, viewW, viewH); const allShaderPrograms = this._allShaderPrograms; const currentShader = batchState.currentShader; for (let i = 0, len = allShaderPrograms.length; i < len; ++i) { const s = allShaderPrograms[i]; if (s === currentShader) s.UpdateMatP(matP, true); else s.SetMatPStale() } mat4.copy(batchState.currentMatP, matP) } SetViewportScissor(w, h) { const gl = this._gl; if (this._width === w && this._height === h) { if (this._isScissorViewport) { this.EndBatch(); gl.disable(gl.SCISSOR_TEST); this._isScissorViewport = false; this._viewportScissorWidth = -1; this._viewportScissorHeight = -1; this.SetSize(this._width, this._height, true) } return } if (!this._isScissorViewport) { this.EndBatch(); gl.enable(gl.SCISSOR_TEST); this._isScissorViewport = true } if (this._viewportScissorWidth !== w || this._viewportScissorHeight !== h) { this.EndBatch(); gl.scissor(0, 0, w, h); this._viewportScissorWidth = w; this._viewportScissorHeight = h; this.SetSize(this._width, this._height, true) } } RemoveViewportScissor() { const gl = this._gl; if (this._isScissorViewport) { this.EndBatch(); gl.disable(gl.SCISSOR_TEST); this._isScissorViewport = false } this._viewportScissorWidth = -1; this._viewportScissorHeight = -1 } GetScissoredViewportWidth() { if (this._isScissorViewport) return this._viewportScissorWidth; else return this.GetWidth() } GetScissoredViewportHeight() { if (this._isScissorViewport) return this._viewportScissorHeight; else return this.GetHeight() } UpdateModelView() { if (areMat4sEqual(this._lastMV, this._matMV)) return; const b = this.PushBatch(); b.InitUpdateModelView(this._matMV); mat4.copy(this._lastMV, this._matMV); this._topOfBatch = 0 } GetBatchState() { return this._batchState } PushBatch() { const batch = this._batch; if (this._batchPtr === batch.length) batch.push(new C3.Gfx.WebGLBatchJob(this._batchState)); return batch[this._batchPtr++] } EndBatch() { if (this._batchPtr === 0) return; if (this.IsContextLost()) return; this._WriteBuffers(); this._ExecuteBatch(); this._batchPtr = 0; this._vertexPtr = 0; this._texPtr = 0; this._pointPtr = 0; this._topOfBatch = 0 } _WriteBuffers() { const gl = this._gl; if (this._pointPtr > 0) { gl.bindBuffer(gl.ARRAY_BUFFER, this._pointBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._pointData.subarray(0, this._pointPtr)) } if (this._vertexPtr > 0) { gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._vertexData.subarray(0, this._vertexPtr)); gl.bindBuffer(gl.ARRAY_BUFFER, this._texcoordBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, this._texcoordData.subarray(0, this._texPtr)) } } _ExecuteBatch() { const batch = this._batch; for (let i = 0, len = this._batchPtr; i < len; ++i) batch[i].Run() } GetOpacity() { return this._lastColor.getA() } SetColorRgba(r, g, b, a) { const lastColor = this._lastColor; if (lastColor.equalsRgba(r, g, b, a)) return; lastColor.setRgba(r, g, b, a); const batch = this.PushBatch(); batch.InitSetColor(lastColor); this._topOfBatch = 0; this._currentStateGroup = null } SetOpacity(a) { const lastColor = this._lastColor; if (lastColor.getA() === a) return; lastColor.setA(a); const batch = this.PushBatch(); batch.InitSetColor(lastColor); this._topOfBatch = 0; this._currentStateGroup = null } SetColor(c) { const lastColor = this._lastColor; if (lastColor.equals(c)) return; lastColor.set(c); const batch = this.PushBatch(); batch.InitSetColor(lastColor); this._topOfBatch = 0; this._currentStateGroup = null } ResetColor() { this.SetColorRgba(1, 1, 1, 1) } GetColor() { return this._lastColor } SetTexture(rendererTex) { if (rendererTex === this._lastTexture0) return; const b = this.PushBatch(); b.InitSetTexture(rendererTex); this._lastTexture0 = rendererTex; this._topOfBatch = 0 } _ResetLastTexture() { this._lastTexture0 = null } SetBlendMode(bm) { const arr = this._GetBlendByIndex(bm); this._SetBlend(arr[0], arr[1]) } SetNamedBlendMode(bm) { const o = this.GetNamedBlend(bm); this._SetBlend(o.srcBlend, o.destBlend) } _SetBlend(s, d) { if (s === this._lastSrcBlend && d === this._lastDestBlend) return; const b = this.PushBatch(); b.InitSetBlend(s, d); this._lastSrcBlend = s; this._lastDestBlend = d; this._topOfBatch = 0; this._currentStateGroup = null } IsPremultipliedAlphaBlend() { return this._lastSrcBlend === this._gl.ONE && this._lastDestBlend === this._gl.ONE_MINUS_SRC_ALPHA } SetAlphaBlend() { this._SetBlend(this._gl.ONE, this._gl.ONE_MINUS_SRC_ALPHA) } SetNoPremultiplyAlphaBlend() { this._SetBlend(this._gl.SRC_ALPHA, this._gl.ONE_MINUS_SRC_ALPHA) } SetCopyBlend() { this._SetBlend(this._gl.ONE, this._gl.ZERO) } Rect(r) { this.Rect2(r.getLeft(), r.getTop(), r.getRight(), r.getBottom()) } Rect2(left, top, right, bottom) { this.Quad2(left, top, right, top, right, bottom, left, bottom) } _ExtendQuadBatch() { let v = this._vertexPtr; if (v >= this._lastVertexPtr) { this.EndBatch(); v = 0 } if (this._topOfBatch === 1) this._batch[this._batchPtr - 1]._indexCount += 6; else { const b = this.PushBatch(); b.InitQuad(this._is3d ? v : v / 2 * 3, 6); this._topOfBatch = 1 } } _WriteQuadToVertexBuffer(quad) { quad.writeToTypedArray3D(this._vertexData, this._vertexPtr, this._baseZ + this._currentZ); this._vertexPtr += 12 } Quad(quad) { this._ExtendQuadBatch(); this._WriteQuadToVertexBuffer(quad); defaultTexCoordsQuad.writeToTypedArray(this._texcoordData, this._texPtr); this._texPtr += 8 } Quad2(tlx, tly, trx, try_, brx, bry, blx, bly) { this._ExtendQuadBatch(); const vd = this._vertexData; let v = this._vertexPtr; const z = this._baseZ + this._currentZ; if (this._is3d) { vd[v++] = tlx; vd[v++] = tly; vd[v++] = z; vd[v++] = trx; vd[v++] = try_; vd[v++] = z; vd[v++] = brx; vd[v++] = bry; vd[v++] = z; vd[v++] = blx; vd[v++] = bly; vd[v++] = z } else { vd[v++] = tlx; vd[v++] = tly; vd[v++] = trx; vd[v++] = try_; vd[v++] = brx; vd[v++] = bry; vd[v++] = blx; vd[v++] = bly } this._vertexPtr = v; defaultTexCoordsQuad.writeToTypedArray(this._texcoordData, this._texPtr); this._texPtr += 8 } Quad3(quad, rcTex) { this._ExtendQuadBatch(); this._WriteQuadToVertexBuffer(quad); rcTex.writeAsQuadToTypedArray(this._texcoordData, this._texPtr); this._texPtr += 8 } Quad4(quad, uv) { this._ExtendQuadBatch(); this._WriteQuadToVertexBuffer(quad); uv.writeToTypedArray(this._texcoordData, this._texPtr); this._texPtr += 8 } FullscreenQuad(mode, curTex) { mat4.copy(tmpMat4, this._lastMV); vec3.copy(tmpVec3, this._cam); vec3.copy(tmpVec3b, this._look); this._cam[0] = 0; this._cam[1] = 0; this._cam[2] = 100 * self.devicePixelRatio; this._look[0] = 0; this._look[1] = 0; this._look[2] = 0; this.ResetModelView(); this.UpdateModelView(); if (this._isScissorViewport) { const left = this._viewportScissorWidth / 2; const top = this._viewportScissorHeight / 2; tmpRect.set(-left, top, -left + this._viewportScissorWidth, top - this._viewportScissorHeight); tmpQuad.setFromRect(tmpRect); tmpRect.set(0, 0, this._viewportScissorWidth / this._width, this._viewportScissorHeight / this._height); this.Quad3(tmpQuad, tmpRect) } else if (mode === "crop" && this._currentRenderTarget && curTex) { const left = this._width / 2; const top = this._height / 2; const srcW = curTex.GetWidth(); const srcH = curTex.GetHeight(); const destW = this._currentRenderTarget.GetWidth(); const destH = this._currentRenderTarget.GetHeight(); const copyW = Math.min(destW, srcW); const copyH = Math.min(destH, srcH); const srcOffY = Math.max(srcH - destH, 0); const destOffY = Math.max(destH - srcH, 0); tmpRect.set(-left, top - destOffY, -left + copyW, top - copyH - destOffY); tmpQuad.setFromRect(tmpRect); tmpRect.set(0, srcOffY, copyW, copyH + srcOffY); tmpRect.divide(srcW, srcH); this.Quad3(tmpQuad, tmpRect) } else { let[width,height] = this.GetRenderTargetSize(this._currentRenderTarget); const halfW = width / 2; const halfH = height / 2; this.Rect2(-halfW, halfH, halfW, -halfH) } mat4.copy(this._matMV, tmpMat4); vec3.copy(this._cam, tmpVec3); vec3.copy(this._look, tmpVec3b); this.UpdateModelView() } ConvexPoly(pts) { const pts_count = pts.length / 2; if (pts_count < 3) throw new Error("need at least 3 points"); const tris = pts_count - 2; const last_tri = tris - 1; const p0x = pts[0]; const p0y = pts[1]; for (let i = 0; i < tris; i += 2) { const i2 = i * 2; const p1x = pts[i2 + 2]; const p1y = pts[i2 + 3]; const p2x = pts[i2 + 4]; const p2y = pts[i2 + 5]; if (i === last_tri) this.Quad2(p0x, p0y, p1x, p1y, p2x, p2y, p2x, p2y); else { const p3x = pts[i2 + 6]; const p3y = pts[i2 + 7]; this.Quad2(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) } } } Line(x1, y1, x2, y2) { const a = C3.angleTo(x1, y1, x2, y2); const sin_a = Math.sin(a); const cos_a = Math.cos(a); const halfLineWidth = this._lineWidth * .5; const sin_a_hlw = sin_a * halfLineWidth; const cos_a_hlw = cos_a * halfLineWidth; const lineCap = this._lineCap; if (lineCap === 2) this.LinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw); else if (lineCap === 1) this.LinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw); else this.LinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) } LinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) { const lineOffset = this._lineOffset; const startX = x1 + lineOffset - cos_a_hlw; const startY = y1 + lineOffset - sin_a_hlw; const endX = x2 + lineOffset + cos_a_hlw; const endY = y2 + lineOffset + sin_a_hlw; const cos_a_lw = cos_a_hlw * 2; const sin_a_lw = sin_a_hlw * 2; const tlx = startX + sin_a_hlw; const tly = startY - cos_a_hlw; const blx = startX - sin_a_hlw + cos_a_lw; const bly = startY + cos_a_hlw + sin_a_lw; const trx = endX + sin_a_hlw; const try_ = endY - cos_a_hlw; const brx = endX - sin_a_hlw - cos_a_lw; const bry = endY + cos_a_hlw - sin_a_lw; this.Quad2(tlx, tly, trx, try_, brx, bry, blx, bly) } LinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) { const lineOffset = this._lineOffset; const startX = x1 + lineOffset - cos_a_hlw; const startY = y1 + lineOffset - sin_a_hlw; const endX = x2 + lineOffset + cos_a_hlw; const endY = y2 + lineOffset + sin_a_hlw; const tlx = startX + sin_a_hlw; const tly = startY - cos_a_hlw; const blx = startX - sin_a_hlw; const bly = startY + cos_a_hlw; const trx = endX + sin_a_hlw; const try_ = endY - cos_a_hlw; const brx = endX - sin_a_hlw; const bry = endY + cos_a_hlw; this.Quad2(tlx, tly, trx, try_, brx, bry, blx, bly) } LinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw) { const lineOffset = this._lineOffset; const startX = x1 + lineOffset; const startY = y1 + lineOffset; const endX = x2 + lineOffset; const endY = y2 + lineOffset; const tlx = startX + sin_a_hlw; const tly = startY - cos_a_hlw; const blx = startX - sin_a_hlw; const bly = startY + cos_a_hlw; const trx = endX + sin_a_hlw; const try_ = endY - cos_a_hlw; const brx = endX - sin_a_hlw; const bry = endY + cos_a_hlw; this.Quad2(tlx, tly, trx, try_, brx, bry, blx, bly) } TexturedLine(x1, y1, x2, y2, u, v) { const a = C3.angleTo(x1, y1, x2, y2); const sin_a = Math.sin(a); const cos_a = Math.cos(a); const halfLineWidth = this._lineWidth * .5; const sin_a_hlw = sin_a * halfLineWidth; const cos_a_hlw = cos_a * halfLineWidth; const lineCap = this._lineCap; if (lineCap === 2) this.TexturedLinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v); else if (lineCap === 1) this.TexturedLinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v); else this.TexturedLinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) } TexturedLinePreCalc_LineCap2(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) { const lineOffset = this._lineOffset; const startX = x1 + lineOffset - cos_a_hlw; const startY = y1 + lineOffset - sin_a_hlw; const endX = x2 + lineOffset + cos_a_hlw; const endY = y2 + lineOffset + sin_a_hlw; const cos_a_lw = cos_a_hlw * 2; const sin_a_lw = sin_a_hlw * 2; const tlx = startX + sin_a_hlw; const tly = startY - cos_a_hlw; const blx = startX - sin_a_hlw + cos_a_lw; const bly = startY + cos_a_hlw + sin_a_lw; const trx = endX + sin_a_hlw; const try_ = endY - cos_a_hlw; const brx = endX - sin_a_hlw - cos_a_lw; const bry = endY + cos_a_hlw - sin_a_lw; tmpQuad.set(tlx, tly, trx, try_, brx, bry, blx, bly); tmpRect.set(u, 0, v, 0); this.Quad3(tmpQuad, tmpRect) } TexturedLinePreCalc_LineCap1(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) { const lineOffset = this._lineOffset; const startX = x1 + lineOffset - cos_a_hlw; const startY = y1 + lineOffset - sin_a_hlw; const endX = x2 + lineOffset + cos_a_hlw; const endY = y2 + lineOffset + sin_a_hlw; const tlx = startX + sin_a_hlw; const tly = startY - cos_a_hlw; const blx = startX - sin_a_hlw; const bly = startY + cos_a_hlw; const trx = endX + sin_a_hlw; const try_ = endY - cos_a_hlw; const brx = endX - sin_a_hlw; const bry = endY + cos_a_hlw; tmpQuad.set(tlx, tly, trx, try_, brx, bry, blx, bly); tmpRect.set(u, 0, v, 0); this.Quad3(tmpQuad, tmpRect) } TexturedLinePreCalc_LineCap0(x1, y1, x2, y2, sin_a_hlw, cos_a_hlw, u, v) { const lineOffset = this._lineOffset; const startX = x1 + lineOffset; const startY = y1 + lineOffset; const endX = x2 + lineOffset; const endY = y2 + lineOffset; const tlx = startX + sin_a_hlw; const tly = startY - cos_a_hlw; const blx = startX - sin_a_hlw; const bly = startY + cos_a_hlw; const trx = endX + sin_a_hlw; const try_ = endY - cos_a_hlw; const brx = endX - sin_a_hlw; const bry = endY + cos_a_hlw; tmpQuad.set(tlx, tly, trx, try_, brx, bry, blx, bly); tmpRect.set(u, 0, v, 0); this.Quad3(tmpQuad, tmpRect) } LineRect(left, top, right, bottom) { const halfLineWidth = this._lineWidth * .5; const lineCap = this._lineCap; if (lineCap === 2) this._LineRectPreCalc_LineCap2(left, top, right, bottom, halfLineWidth); else if (lineCap === 1) this._LineRectPreCalc_LineCap1(left, top, right, bottom, halfLineWidth); else this._LineRectPreCalc_LineCap0(left, top, right, bottom, halfLineWidth) } _LineRectPreCalc_LineCap2(left, top, right, bottom, halfLineWidth) { this.LinePreCalc_LineCap2(left, top, right, top, 0, halfLineWidth); this.LinePreCalc_LineCap2(right, top, right, bottom, halfLineWidth, 0); this.LinePreCalc_LineCap2(right, bottom, left, bottom, 0, -halfLineWidth); this.LinePreCalc_LineCap2(left, bottom, left, top, -halfLineWidth, 0) } _LineRectPreCalc_LineCap1(left, top, right, bottom, halfLineWidth) { this.LinePreCalc_LineCap1(left, top, right, top, 0, halfLineWidth); this.LinePreCalc_LineCap1(right, top, right, bottom, halfLineWidth, 0); this.LinePreCalc_LineCap1(right, bottom, left, bottom, 0, -halfLineWidth); this.LinePreCalc_LineCap1(left, bottom, left, top, -halfLineWidth, 0) } _LineRectPreCalc_LineCap0(left, top, right, bottom, halfLineWidth) { this.LinePreCalc_LineCap0(left, top, right, top, 0, halfLineWidth); this.LinePreCalc_LineCap0(right, top, right, bottom, halfLineWidth, 0); this.LinePreCalc_LineCap0(right, bottom, left, bottom, 0, -halfLineWidth); this.LinePreCalc_LineCap0(left, bottom, left, top, -halfLineWidth, 0) } LineRect2(r) { this.LineRect(r.getLeft(), r.getTop(), r.getRight(), r.getBottom()) } LineQuad(q) { const a = C3.angleTo(q.getTlx(), q.getTly(), q.getTrx(), q.getTry()); const sin_a = Math.sin(a); const cos_a = Math.cos(a); const halfLineWidth = this._lineWidth * .5; const sin_a_hlw = sin_a * halfLineWidth; const cos_a_hlw = cos_a * halfLineWidth; const lineCap = this._lineCap; if (lineCap === 2) this._LineQuadPreCalc_LineCap2(q, sin_a_hlw, cos_a_hlw); else if (lineCap === 1) this._LineQuadPreCalc_LineCap1(q, sin_a_hlw, cos_a_hlw); else this._LineQuadPreCalc_LineCap0(q, sin_a_hlw, cos_a_hlw) } _LineQuadPreCalc_LineCap2(q, sin_a_hlw, cos_a_hlw) { this.LinePreCalc_LineCap2(q.getTlx(), q.getTly(), q.getTrx(), q.getTry(), sin_a_hlw, cos_a_hlw); this.LinePreCalc_LineCap2(q.getTrx(), q.getTry(), q.getBrx(), q.getBry(), cos_a_hlw, -sin_a_hlw); this.LinePreCalc_LineCap2(q.getBrx(), q.getBry(), q.getBlx(), q.getBly(), -sin_a_hlw, -cos_a_hlw); this.LinePreCalc_LineCap2(q.getBlx(), q.getBly(), q.getTlx(), q.getTly(), -cos_a_hlw, sin_a_hlw) } _LineQuadPreCalc_LineCap1(q, sin_a_hlw, cos_a_hlw) { this.LinePreCalc_LineCap1(q.getTlx(), q.getTly(), q.getTrx(), q.getTry(), sin_a_hlw, cos_a_hlw); this.LinePreCalc_LineCap1(q.getTrx(), q.getTry(), q.getBrx(), q.getBry(), cos_a_hlw, -sin_a_hlw); this.LinePreCalc_LineCap1(q.getBrx(), q.getBry(), q.getBlx(), q.getBly(), -sin_a_hlw, -cos_a_hlw); this.LinePreCalc_LineCap1(q.getBlx(), q.getBly(), q.getTlx(), q.getTly(), -cos_a_hlw, sin_a_hlw) } _LineQuadPreCalc_LineCap0(q, sin_a_hlw, cos_a_hlw) { this.LinePreCalc_LineCap0(q.getTlx(), q.getTly(), q.getTrx(), q.getTry(), sin_a_hlw, cos_a_hlw); this.LinePreCalc_LineCap0(q.getTrx(), q.getTry(), q.getBrx(), q.getBry(), cos_a_hlw, -sin_a_hlw); this.LinePreCalc_LineCap0(q.getBrx(), q.getBry(), q.getBlx(), q.getBly(), -sin_a_hlw, -cos_a_hlw); this.LinePreCalc_LineCap0(q.getBlx(), q.getBly(), q.getTlx(), q.getTly(), -cos_a_hlw, sin_a_hlw) } SetLineWidth(n) { this._lineWidth = n; this._lineWidthStack[this._lineWidthStack.length - 1] = n } GetLineWidth() { return this._lineWidth } PushLineWidth(n) { if (this._lineWidthStack.length >= 100) throw new Error("pushed too many line widths - check push/pop pairs"); this._lineWidthStack.push(n); this._lineWidth = n } PopLineWidth() { if (this._lineWidthStack.length <= 1) throw new Error("cannot pop last line width - check push/pop pairs"); this._lineWidthStack.pop(); this._lineWidth = this._lineWidthStack[this._lineWidthStack.length - 1] } SetLineCapButt() { this._lineCap = 0; this._lineCapStack[this._lineCapStack.length - 1] = 0 } SetLineCapSquare() { this._lineCap = 1; this._lineCapStack[this._lineCapStack.length - 1] = 0 } SetLineCapZag() { this._lineCap = 2; this._lineCapStack[this._lineCapStack.length - 1] = 0 } PushLineCap(type) { if (type === "butt") this.PushLineCapButt(); else if (type === "square") this.PushLineCapSquare(); else if (type === "zag") this.PushLineCapZag(); else throw new Error("invalid line cap"); } PushLineCapButt() { if (this._lineCapStack.length >= 100) throw new Error("pushed too many line caps - check push/pop pairs"); this._lineCapStack.push(0); this._lineCap = 0 } PushLineCapSquare() { if (this._lineCapStack.length >= 100) throw new Error("pushed too many line caps - check push/pop pairs"); this._lineCapStack.push(1); this._lineCap = 1 } PushLineCapZag() { if (this._lineCapStack.length >= 100) throw new Error("pushed too many line caps - check push/pop pairs"); this._lineCapStack.push(2); this._lineCap = 2 } PopLineCap() { if (this._lineCapStack.length <= 1) throw new Error("cannot pop last line cap - check push/pop pairs"); this._lineCapStack.pop(); this._lineCap = this._lineCapStack[this._lineCapStack.length - 1] } SetLineOffset(n) { this._lineOffset = n; this._lineOffsetStack[this._lineOffsetStack.length - 1] = n } GetLineOffset() { return this._lineOffset } PushLineOffset(n) { if (this._lineOffsetStack.length >= 100) throw new Error("pushed too many line offsets - check push/pop pairs"); this._lineOffsetStack.push(n); this._lineOffset = n } PopLineOffset() { if (this._lineOffsetStack.length <= 1) throw new Error("cannot pop last line offset - check push/pop pairs"); this._lineOffsetStack.pop(); this._lineOffset = this._lineOffsetStack[this._lineOffsetStack.length - 1] } SetPointTextureCoords(rect) { if (this._lastPointTexCoords.equals(rect)) return; this._lastPointTexCoords.copy(rect); const b = this.PushBatch(); b.InitSetPointTexCoords(rect); this._topOfBatch = 0 } Point(x_, y_, size_, opacity_) { if (this._pointPtr >= LAST_POINT) this.EndBatch(); let p = this._pointPtr; const z = this._baseZ + this._currentZ; if (this._topOfBatch === 2 && this._lastPointZ === z) this._batch[this._batchPtr - 1]._indexCount++; else { const b = this.PushBatch(); b.InitPoints(p, z); this._topOfBatch = 2; this._lastPointZ = z } const pd = this._pointData; pd[p++] = x_; pd[p++] = y_; pd[p++] = size_; pd[p++] = opacity_; this._pointPtr = p } SetProgram(program) { if (this._lastProgram === program) return; const b = this.PushBatch(); b.InitSetProgram(program); this._lastProgram = program; this._topOfBatch = 0; this._currentStateGroup = null } SetTextureFillMode() { this.SetProgram(this._spTextureFill) } SetDeviceTransformTextureFillMode() { this.SetProgram(this._spDeviceTransformTextureFill) } SetColorFillMode() { this.SetProgram(this._spColorFill) } SetLinearGradientFillMode() { this.SetProgram(this._spLinearGradientFill) } SetGradientColor(c) { const b = this.PushBatch(); b.InitSetGradientColor(c); this._topOfBatch = 0 } SetHardEllipseFillMode() { this.SetProgram(this._spHardEllipseFill) } SetHardEllipseOutlineMode() { this.SetProgram(this._spHardEllipseOutline) } SetSmoothEllipseFillMode() { this.SetProgram(this._spSmoothEllipseFill) } SetSmoothEllipseOutlineMode() { this.SetProgram(this._spSmoothEllipseOutline) } SetEllipseParams(pixelW, pixelH, outlineThickness=1) { const b = this.PushBatch(); b.InitSetEllipseParams(pixelW, pixelH, outlineThickness); this._topOfBatch = 0 } SetSmoothLineFillMode() { this.SetProgram(this._spSmoothLineFill) } SetTilemapFillMode() { this.SetProgram(this._spTilemapFill) } SetTilemapInfo(srcRect, textureWidth, textureHeight, tileWidth, tileHeight, tileSpacingX, tileSpacingY) { if (this._lastProgram !== this._spTilemapFill) throw new Error("must set tilemap fill mode first"); const b = this.PushBatch(); b.InitSetTilemapInfo(srcRect, textureWidth, textureHeight, tileWidth, tileHeight, tileSpacingX, tileSpacingY); this._topOfBatch = 0 } SetProgramParameters(backTex, destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time, params) { const s = this._lastProgram; const hasAnyOptionalUniforms = s._hasAnyOptionalUniforms; const hasAnyCustomParams = !!params.length; if ((!hasAnyOptionalUniforms || s.AreOptionalUniformsAlreadySetInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time)) && (!hasAnyCustomParams || s.AreCustomParametersAlreadySetInBatch(params))) return; const b = this.PushBatch(); b.InitSetProgramParameters(); if (hasAnyOptionalUniforms) { s.SetOptionalUniformsInBatch(destRect, srcRect, srcOriginRect, layoutRect, pixelWidth, pixelHeight, layerScale, layerAngle, time); const mat4param = b._mat4param; mat4param[0] = pixelWidth; mat4param[1] = pixelHeight; destRect.writeToTypedArray(mat4param, 2); mat4param[6] = layerScale; mat4param[7] = layerAngle; srcRect.writeToTypedArray(mat4param, 12); const colorParam = b._colorParam; layoutRect.writeToTypedArray(colorParam, 0); const tmp = colorParam[1]; colorParam[1] = colorParam[3]; colorParam[3] = tmp; srcOriginRect.writeToTypedArray(b._srcOriginRect, 0); b._startIndex = time; if (s._uSamplerBack.IsUsed()) b._texParam = backTex ? backTex.GetTexture() : null; else b._texParam = null } if (hasAnyCustomParams) { s.SetCustomParametersInBatch(params); C3.shallowAssignArray(b._shaderParams, params) } this._topOfBatch = 0 } ClearRgba(r, g, b_, a) { const b = this.PushBatch(); b.InitClearSurface2(r, g, b_, a); this._topOfBatch = 0 } Clear(c) { const b = this.PushBatch(); b.InitClearSurface(c); this._topOfBatch = 0 } ClearRect(x, y, w, h) { this.ClearRect4(x, y, w, h, 0, 0, 0, 0) } ClearRect2(rc) { this.ClearRect4(rc.getLeft(), rc.getTop(), rc.width(), rc.height(), 0, 0, 0, 0) } ClearRect3(rc, c) { this.ClearRect4(rc.getLeft(), rc.getTop(), rc.width(), rc.height(), c.getR(), c.getG(), c.getB(), c.getA()) } ClearRect4(x, y, w, h, r, g, b, a) { if (w < 0 || h < 0) return; const batch = this.PushBatch(); batch.InitClearRect(x, y, w, h, r, g, b, a); this._topOfBatch = 0 } Start() {} Finish() { super.Finish(); this._gl.flush() } CheckForQueryResults() { for (const qrb of this._allQueryResultBuffers) qrb.CheckForResults(this._frameNumber) } IsContextLost() { return !this._gl || this._gl.isContextLost() || this._isInitialisingAfterContextRestored } OnContextLost() { C3.Gfx.WebGLRendererTexture.OnContextLost(); C3.Gfx.WebGLRenderTarget.OnContextLost(); C3.Gfx.RendererText.OnContextLost(); for (const qrb of this._allQueryResultBuffers) qrb.Clear(); this._extensions = []; this._timerExt = null; this._parallelShaderCompileExt = null; this._unmaskedVendor = "(unavailable)"; this._unmaskedRenderer = "(unavailable)"; this._lastProgram = null; this._spTextureFill = null; this._spDeviceTransformTextureFill = null; this._spColorFill = null; this._spLinearGradientFill = null; this._spHardEllipseFill = null; this._spHardEllipseOutline = null; this._spSmoothEllipseFill = null; this._spSmoothEllipseOutline = null; this._spSmoothLineFill = null; this._spPoints = null; this._spTilemapFill = null; for (const stateGroup of this._stateGroups.values()) stateGroup.OnContextLost(); for (const s of this._allShaderPrograms) s.Release(); this._ClearAllShaderPrograms() } async OnContextRestored() { this._isInitialisingAfterContextRestored = true; await this.InitState(); this._isInitialisingAfterContextRestored = false; for (const stateGroup of this._stateGroups.values()) stateGroup.OnContextRestored(this); this.SetSize(this._width, this._height, true) } CreateStaticTexture(data, opts) { if (this.IsContextLost()) throw new Error("context lost"); this.EndBatch(); const rendererTex = C3.New(C3.Gfx.WebGLRendererTexture, this); rendererTex._CreateStatic(data, opts); return rendererTex } CreateStaticTextureAsync(data, opts) { if (this.IsContextLost()) return Promise.reject("context lost"); opts = Object.assign({}, opts); const isTiled = opts.wrapX && opts.wrapX !== "clamp-to-edge" || opts.wrapY && opts.wrapY !== "clamp-to-edge"; if (C3.Supports.ImageBitmapOptions && (this.SupportsNPOTTextures() || !isTiled)) { opts.premultiplyAlpha = false; return createImageBitmap(data, { "premultiplyAlpha": "premultiply" }).then(imageBitmap=>C3.Asyncify(()=>this.CreateStaticTexture(imageBitmap, opts))) } else if (C3.Supports.ImageBitmap) return createImageBitmap(data).then(imageBitmap=>C3.Asyncify(()=>this.CreateStaticTexture(imageBitmap, opts))); else if (data instanceof Blob) return C3.BlobToImage(data, true).then(img=>this.CreateStaticTextureAsync(img, opts)); else if (typeof HTMLImageElement !== "undefined" && data instanceof HTMLImageElement && typeof data["decode"] === "function") return data["decode"]().then(()=>C3.Asyncify(()=>this.CreateStaticTexture(data, opts))); else return C3.Asyncify(()=>this.CreateStaticTexture(data, opts)) } CreateDynamicTexture(width, height, opts) { this.EndBatch(); const rendererTex = C3.New(C3.Gfx.WebGLRendererTexture, this); rendererTex._CreateDynamic(width, height, opts); return rendererTex } UpdateTexture(data, rendererTex, opts) { this.EndBatch(); rendererTex._Update(data, opts) } DeleteTexture(rendererTex) { if (!rendererTex) return; rendererTex.SubtractReference(); if (rendererTex.GetReferenceCount() > 0) return; this.EndBatch(); if (rendererTex === this._lastTexture0) { this._gl.bindTexture(this._gl.TEXTURE_2D, null); this._lastTexture0 = null } if (rendererTex === this._lastTexture1) { this._gl.activeTexture(this._gl.TEXTURE1); this._gl.bindTexture(this._gl.TEXTURE_2D, null); this._gl.activeTexture(this._gl.TEXTURE0); this._lastTexture1 = null } rendererTex._Delete() } CreateRenderTarget(opts) { let width = this._width; let height = this._height; let isDefaultSize = true; if (opts) { if (typeof opts.width === "number") { width = opts.width; isDefaultSize = false } if (typeof opts.height === "number") { height = opts.height; isDefaultSize = false } } if (width <= 0 || height <= 0) throw new Error("invalid size"); this.EndBatch(); const renderTarget = C3.New(C3.Gfx.WebGLRenderTarget, this); renderTarget._Create(width, height, Object.assign({ isDefaultSize }, opts)); this._currentRenderTarget = null; this._batchState.currentFramebuffer = null; return renderTarget } SetRenderTarget(renderTarget) { if (renderTarget === this._currentRenderTarget) return; let newViewWidth, newViewHeight, newSurfaceWidth, newSurfaceHeight; if (renderTarget) { if (renderTarget.IsDefaultSize()) renderTarget._Resize(this._width, this._height); newSurfaceWidth = renderTarget.GetWidth(); newSurfaceHeight = renderTarget.GetHeight(); newViewWidth = newSurfaceWidth; newViewHeight = newSurfaceHeight } else { newSurfaceWidth = this._width; newSurfaceHeight = this._height; newViewWidth = this.GetScissoredViewportWidth(); newViewHeight = this.GetScissoredViewportHeight() } const didSurfaceSizeChange = this._lastBackbufferWidth !== newSurfaceWidth || this._lastBackbufferHeight !== newSurfaceHeight; if (didSurfaceSizeChange) this._UpdateViewportRenderer(newViewWidth, newViewHeight, newSurfaceWidth, newSurfaceHeight); const b = this.PushBatch(); b.InitSetRenderTarget(renderTarget, didSurfaceSizeChange, this._matP); this._currentRenderTarget = renderTarget; this._topOfBatch = 0 } GetRenderTarget() { return this._currentRenderTarget } GetRenderTargetSize(renderTarget) { if (renderTarget) return [renderTarget.GetWidth(), renderTarget.GetHeight()]; else return [this._width, this._height] } CopyRenderTarget(renderTarget, mode="stretch") { if (this._version < 2 || this._currentRenderTarget && this._currentRenderTarget.GetMultisampling() > 0) { this.SetCopyBlend(); this.ResetColor(); this.DrawRenderTarget(renderTarget, mode) } else { const b = this.PushBatch(); b.InitBlitFramebuffer(renderTarget, this._currentRenderTarget, mode); this._topOfBatch = 0 } } DrawRenderTarget(renderTarget, mode="stretch") { const tex = renderTarget.GetTexture(); if (!tex) throw new Error("not a texture-backed render target"); this.SetTexture(tex); this.FullscreenQuad(mode, tex) } InvalidateRenderTarget(renderTarget) { if (this._version < 2) return; const b = this.PushBatch(); b.InitInvalidateFramebuffer(renderTarget._GetFramebuffer()); this._topOfBatch = 0 } DeleteRenderTarget(renderTarget) { this.SetRenderTarget(null); this.EndBatch(); const renderTex = renderTarget.GetTexture(); if (renderTex === this._lastTexture0) { this._gl.bindTexture(this._gl.TEXTURE_2D, null); this._lastTexture0 = null } if (renderTex === this._lastTexture1) { this._gl.activeTexture(this._gl.TEXTURE1); this._gl.bindTexture(this._gl.TEXTURE_2D, null); this._gl.activeTexture(this._gl.TEXTURE0); this._lastTexture1 = null } renderTarget._Delete() } async ReadBackRenderTargetToImageData(renderTarget, forceSynchronous, areaRect) { this.EndBatch(); const oldRenderTarget = this._currentRenderTarget; let width, height, framebuffer; if (renderTarget) { width = renderTarget.GetWidth(); height = renderTarget.GetHeight(); framebuffer = renderTarget._GetFramebuffer() } else { width = this.GetWidth(); height = this.GetHeight(); framebuffer = null } let x = 0; let y = 0; let areaWidth = width; let areaHeight = height; if (areaRect) { x = C3.clamp(Math.floor(areaRect.getLeft()), 0, width - 1); y = C3.clamp(Math.floor(areaRect.getTop()), 0, height - 1); let w = areaRect.width(); if (w === 0) w = width - x; else w = C3.clamp(Math.floor(w), 0, width - x); let h = areaRect.height(); if (h === 0) h = height - y; else h = C3.clamp(Math.floor(h), 0, height - y); areaWidth = w; areaHeight = h; y = height - (y + areaHeight) } const gl = this._gl; gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); const restorePreviousRenderTarget = ()=>{ gl.bindFramebuffer(gl.FRAMEBUFFER, null); this._currentRenderTarget = null; this._batchState.currentFramebuffer = null; this.SetRenderTarget(oldRenderTarget) } ; let imageData; if (!forceSynchronous && this.GetWebGLVersionNumber() >= 2) { gl.bindFramebuffer(gl.READ_FRAMEBUFFER, framebuffer); const pixelBuffer = gl.createBuffer(); const bufferSize = areaWidth * areaHeight * 4; const PIXEL_PACK_BUFFER = gl["PIXEL_PACK_BUFFER"]; gl.bindBuffer(PIXEL_PACK_BUFFER, pixelBuffer); gl.bufferData(PIXEL_PACK_BUFFER, bufferSize, gl["STREAM_READ"]); gl.readPixels(x, y, areaWidth, areaHeight, gl.RGBA, gl.UNSIGNED_BYTE, 0); gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null); gl.bindBuffer(PIXEL_PACK_BUFFER, null); restorePreviousRenderTarget(); const sync = gl["fenceSync"](gl["SYNC_GPU_COMMANDS_COMPLETE"], 0); await this._WaitForObjectReady(()=>gl["getSyncParameter"](sync, gl["SYNC_STATUS"]) === gl["SIGNALED"]); gl["deleteSync"](sync); imageData = new ImageData(areaWidth,areaHeight); gl.bindBuffer(PIXEL_PACK_BUFFER, pixelBuffer); gl["getBufferSubData"](PIXEL_PACK_BUFFER, 0, new Uint8Array(imageData.data.buffer), 0, bufferSize); gl.bindBuffer(PIXEL_PACK_BUFFER, null); gl.deleteBuffer(pixelBuffer) } else { imageData = new ImageData(areaWidth,areaHeight); gl.readPixels(x, y, areaWidth, areaHeight, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(imageData.data.buffer)); restorePreviousRenderTarget() } return imageData } StartQuery(query) { if (!this.SupportsGPUProfiling()) return; const b = this.PushBatch(); b.InitStartQuery(query); this._topOfBatch = 0 } EndQuery(query) { if (!this.SupportsGPUProfiling()) return; const b = this.PushBatch(); b.InitEndQuery(query); this._topOfBatch = 0 } _WaitForObjectReady(checkFunc) { const ret = new Promise(resolve=>pendingPolls.add({ resolve, checkFunc })); if (pollRafId === -1) pollRafId = self.requestAnimationFrame(CheckPendingPolls); return ret } IsDesynchronized() { return !!this._attribs["desynchronized"] } GetEstimatedBackBufferMemoryUsage() { return this._width * this._height * (this._attribs["alpha"] ? 4 : 3) } GetEstimatedRenderBufferMemoryUsage() { let ret = 0; for (const t of C3.Gfx.WebGLRenderTarget.allRenderTargets()) { if (t.GetTexture()) continue; ret += t.GetEstimatedMemoryUsage() } return ret } GetEstimatedTextureMemoryUsage() { let ret = 0; for (const t of C3.Gfx.WebGLRendererTexture.allTextures()) ret += t.GetEstimatedMemoryUsage(); return ret } GetEstimatedTotalMemoryUsage() { return this.GetEstimatedBackBufferMemoryUsage() + this.GetEstimatedRenderBufferMemoryUsage() + this.GetEstimatedTextureMemoryUsage() } GetWebGLVersionString() { return this._versionString } GetWebGLVersionNumber() { return this._version } SupportsNPOTTextures() { return this.GetWebGLVersionNumber() >= 2 } GetMaxTextureSize() { return this._maxTextureSize } GetMinPointSize() { return this._minPointSize } GetMaxPointSize() { return this._maxPointSize } SupportsHighP() { return this._highpPrecision !== 0 } GetHighPPrecision() { return this._highpPrecision } GetUnmaskedVendor() { return this._unmaskedVendor } GetUnmaskedRenderer() { return this._unmaskedRenderer } GetExtensions() { return this._extensions } HasMajorPerformanceCaveat() { return this._hasMajorPerformanceCaveat } SupportsGPUProfiling() { return !!this._timerExt } _GetDisjointTimerQueryExtension() { return this._timerExt } _GetParallelShaderCompileExtension() { return this._parallelShaderCompileExt } _AddQueryResultBuffer(qrb) { this._allQueryResultBuffers.add(qrb) } _RemoveQueryResultBuffer(qrb) { this._allQueryResultBuffers.delete(qrb) } _GetTimeQueryStack() { return this._timeQueryStack } GetContext() { return this._gl } _InitBlendModes(gl) { this._InitBlendModeData([["normal", gl.ONE, gl.ONE_MINUS_SRC_ALPHA], ["additive", gl.ONE, gl.ONE], ["xor", gl.ONE, gl.ONE_MINUS_SRC_ALPHA], ["copy", gl.ONE, gl.ZERO], ["destination-over", gl.ONE_MINUS_DST_ALPHA, gl.ONE], ["source-in", gl.DST_ALPHA, gl.ZERO], ["destination-in", gl.ZERO, gl.SRC_ALPHA], ["source-out", gl.ONE_MINUS_DST_ALPHA, gl.ZERO], ["destination-out", gl.ZERO, gl.ONE_MINUS_SRC_ALPHA], ["source-atop", gl.DST_ALPHA, gl.ONE_MINUS_SRC_ALPHA], ["destination-atop", gl.ONE_MINUS_DST_ALPHA, gl.SRC_ALPHA]]) } CreateRendererText() { return C3.New(C3.Gfx.RendererText, this) } CreateWebGLText() { return this.CreateRendererText() } } } ;'use strict'; { const C3 = self.C3; let runtime = null; const keysDownByKey = new Set; function SortZOrderList(a, b) { const layerA = a[0]; const layerB = b[0]; const diff = layerA - layerB; if (diff !== 0) return diff; const indexA = a[1]; const indexB = b[1]; return indexA - indexB } const tempZOrderList = []; const tempInstances = []; let didWarnInAlertPolyfill = false; self.IRuntime = class IRuntime { constructor(runtime_, objects) { runtime = runtime_; Object.defineProperties(this, { assets: { value: runtime.GetAssetManager().GetIAssetManager(), writable: false }, objects: { value: objects, writable: false }, globalVars: { value: {}, writable: false }, projectName: { value: runtime.GetProjectName(), writable: false }, projectVersion: { value: runtime.GetProjectVersion(), writable: false }, storage: { value: new self.IStorage(runtime), writable: false }, isInWorker: { value: runtime.IsInWorker(), writable: false } }); runtime.UserScriptDispatcher().addEventListener("keydown", e=>{ if (keysDownByKey.has(e["key"])) { e.stopPropagation(); return } keysDownByKey.add(e["key"]) } ); runtime.UserScriptDispatcher().addEventListener("keyup", e=>keysDownByKey.delete(e["key"])); runtime.Dispatcher().addEventListener("window-blur", ()=>keysDownByKey.clear()); if (runtime.IsInWorker()) self["alert"] = message=>{ if (!didWarnInAlertPolyfill) { didWarnInAlertPolyfill = true; console.warn("[Construct 3] alert() was called from a Web Worker, because the project 'Use worker' setting is enabled. This method is not normally available in a Web Worker. Construct has implemented the alert for you, but note that other features may be missing in worker mode. You may wish to disable 'Use worker', or use a more convenient function like console.log(). For more information please refer to the scripting section of the manual.") } return this.alert(message) } } _InitGlobalVars(globalVarDescriptors) { Object.defineProperties(this.globalVars, globalVarDescriptors) } addEventListener(name, func) { runtime.UserScriptDispatcher().addEventListener(name, func) } removeEventListener(name, func) { runtime.UserScriptDispatcher().removeEventListener(name, func) } callFunction(name, ...params) { const eventSheetManager = runtime.GetEventSheetManager(); const functionBlock = eventSheetManager.GetFunctionBlockByName(name); if (!functionBlock) throw new Error(`cannot find function name '${name}'`); if (!functionBlock.IsEnabled()) return functionBlock.GetDefaultReturnValue(); if (params.length < functionBlock.GetFunctionParameterCount()) throw new Error(`not enough function parameters passed for '${name}' (${params.length} passed, ${functionBlock.GetFunctionParameterCount()} expected)`); const callEventBlock = functionBlock.GetEventBlock(); let solModifiers = null; const currentEvent = eventSheetManager.GetCurrentEvent(); if (currentEvent) { const sm = currentEvent.GetSolModifiersIncludingParents(); if (sm.length > 0) { solModifiers = sm; eventSheetManager.PushCleanSol(sm) } } const ret = callEventBlock.RunAsExpressionFunctionCall(callEventBlock.GetSolModifiersIncludingParents(), functionBlock.GetReturnType(), functionBlock.GetDefaultReturnValue(), ...params); if (solModifiers) eventSheetManager.PopSol(solModifiers); return ret } setReturnValue(v) { const frame = runtime.GetEventStack().GetCurrentExpFuncStackFrame(); if (!frame) throw new Error("not in a function which returns a value"); switch (frame.GetFunctionReturnType()) { case 1: if (typeof v === "number") frame.SetFunctionReturnValue(v); break; case 2: if (typeof v === "string") frame.SetFunctionReturnValue(v); break; case 3: if (typeof v === "number" || typeof v === "string") frame.SetFunctionReturnValue(v); break } } get dt() { return runtime.GetDt() } get gameTime() { return runtime.GetGameTime() } get wallTime() { return runtime.GetWallTime() } random() { return runtime.Random() } get layout() { return runtime.GetMainRunningLayout().GetILayout() } getLayout(nameOrIndex) { const layoutManager = runtime.GetLayoutManager(); let layout = null; if (typeof nameOrIndex === "number" || typeof nameOrIndex === "string") layout = layoutManager.GetLayout(nameOrIndex); else throw new TypeError("expected string or number"); if (!layout) throw new Error("invalid layout"); return layout.GetILayout() } getAllLayouts() { return runtime.GetLayoutManager().GetAllLayouts().map(layout=>layout.GetILayout()) } goToLayout(nameOrIndex) { const layoutManager = runtime.GetLayoutManager(); let layout = null; if (typeof nameOrIndex === "number" || typeof nameOrIndex === "string") layout = layoutManager.GetLayout(nameOrIndex); else throw new TypeError("expected string or number"); if (!layout) throw new Error("invalid layout"); if (layoutManager.IsPendingChangeMainLayout()) return; layoutManager.ChangeMainLayout(layout) } get keyboard() { const ret = runtime._GetCommonScriptInterfaces().keyboard; if (!ret) throw new Error("runtime.keyboard used but Keyboard object missing - add it to your project first"); return ret } get mouse() { const ret = runtime._GetCommonScriptInterfaces().mouse; if (!ret) throw new Error("runtime.mouse used but Mouse object missing - add it to your project first"); return ret } get touch() { const ret = runtime._GetCommonScriptInterfaces().touch; if (!ret) throw new Error("runtime.touch used but Touch object missing - add it to your project first"); return ret } invokeDownload(url, filename) { runtime.InvokeDownload(url, filename) } getInstanceByUid(uid) { const ret = runtime.GetInstanceByUID(uid); return ret ? ret.GetInterfaceClass() : null } sortZOrder(iterable, callback) { const layout = runtime.GetCurrentLayout(); for (const iinst of iterable) { const inst = runtime._UnwrapScriptInterface(iinst); if (!inst || !inst.GetWorldInfo()) throw new Error("invalid instance"); const wi = inst.GetWorldInfo(); tempZOrderList.push([wi.GetLayer().GetIndex(), wi.GetZIndex()]); tempInstances.push(inst) } if (tempZOrderList.length === 0) return; tempZOrderList.sort(SortZOrderList); tempInstances.sort((a,b)=>callback(a.GetInterfaceClass(), b.GetInterfaceClass())); let anyChanged = false; for (let i = 0, len = tempZOrderList.length; i < len; ++i) { const inst = tempInstances[i]; const layer = layout.GetLayerByIndex(tempZOrderList[i][0]); const toZ = tempZOrderList[i][1]; const layerInstances = layer._GetInstances(); if (layerInstances[toZ] !== inst) { layerInstances[toZ] = inst; inst.GetWorldInfo()._SetLayer(layer); layer.SetZIndicesChanged(); anyChanged = true } } if (anyChanged) runtime.UpdateRender(); C3.clearArray(tempZOrderList); C3.clearArray(tempInstances) } alert(message) { return runtime.PostComponentMessageToDOMAsync("runtime", "alert", { "message": message + (runtime.IsInWorker() ? " [via Web Worker]" : "") }) } } } ;'use strict'; { const C3 = self.C3; let assetManager = null; self.IAssetManager = class IAssetManager { constructor(assetManager_) { assetManager = assetManager_; Object.defineProperties(this, { isWebMOpusSupported: { value: assetManager.IsAudioFormatSupported("audio/webm; codecs=opus"), writable: false } }) } fetchText(url) { return assetManager.FetchText(url) } fetchJson(url) { return assetManager.FetchJson(url) } fetchBlob(url) { return assetManager.FetchBlob(url) } fetchArrayBuffer(url) { return assetManager.FetchArrayBuffer(url) } getProjectFileUrl(url) { return assetManager.GetProjectFileUrl(url) } getMediaFileUrl(url) { if (C3.IsRelativeURL(url)) url = url.toLowerCase(); return assetManager.GetMediaFileUrl(url, assetManager.GetMediaSubfolder()) } get mediaFolder() { return assetManager.GetMediaSubfolder() } async decodeWebMOpus(audioContext, arrayBuffer) { if (this.isWebMOpusSupported) throw new Error("decodeWebMOpus(): not supported because WebM Opus is supported by the platform"); const decodedArrayBuffer = await assetManager.GetRuntime()._WasmDecodeWebMOpus(arrayBuffer); const decodedFloats = new Float32Array(decodedArrayBuffer); const audioBuffer = audioContext["createBuffer"](1, decodedFloats.length, 48E3); const channelBuffer = audioBuffer["getChannelData"](0); channelBuffer.set(decodedFloats); return audioBuffer } loadScripts(...urls) { return assetManager.LoadScripts(...urls) } compileWebAssembly(url) { return assetManager.CompileWebAssembly(url) } loadStyleSheet(url) { return assetManager.LoadStyleSheet(url) } } } ;'use strict'; { self.IStorage = class IStorage { constructor(runtime) { this._storage = runtime._GetProjectStorage() } getItem(key) { return this._storage.getItem(key) } setItem(key, value) { return this._storage.setItem(key, value) } removeItem(key) { return this._storage.removeItem(key) } clear() { return this._storage.clear() } keys() { return this._storage.keys() } } } ;'use strict'; { const C3 = self.C3; const map = new WeakMap; self.IObjectClass = class IObjectClass { constructor(objectClass) { map.set(this, objectClass); Object.defineProperties(this, { name: { value: objectClass.GetName(), writable: false } }); objectClass.GetRuntime()._MapScriptInterface(this, objectClass) } addEventListener(name, func) { map.get(this).UserScriptDispatcher().addEventListener(name, func) } removeEventListener(name, func) { map.get(this).UserScriptDispatcher().removeEventListener(name, func) } getAllInstances() { return map.get(this).GetInstances().map(inst=>inst.GetInterfaceClass()) } getFirstInstance() { const instances = map.get(this).GetInstances(); if (instances.length > 0) return instances[0].GetInterfaceClass(); else return null } getPickedInstances() { return map.get(this).GetCurrentSol().GetInstances().map(inst=>inst.GetInterfaceClass()) } getFirstPickedInstance() { const pickedInstances = map.get(this).GetCurrentSol().GetInstances(); if (pickedInstances.length > 0) return pickedInstances[0].GetInterfaceClass(); else return null } *instances() { for (const inst of map.get(this).GetInstances()) yield inst.GetInterfaceClass() } *pickedInstances() { for (const inst of map.get(this).GetCurrentSol().GetInstances()) yield inst.GetInterfaceClass() } setInstanceClass(Class) { const objectClass = map.get(this); if (objectClass.GetInstanceCount() > 0) throw new Error("setInstanceClass() called too late, because instances have already been created - call in runOnStartup"); map.get(this)._SetUserScriptInstanceClass(Class) } createInstance(layerNameOrIndex, x, y) { if (typeof layerNameOrIndex !== "number" && typeof layerNameOrIndex !== "string") throw new TypeError("invalid layer parameter"); const objectClass = map.get(this); const runtime = objectClass.GetRuntime(); const layer = runtime.GetMainRunningLayout().GetLayer(layerNameOrIndex); if (!layer) throw new Error("invalid layer"); const inst = runtime.CreateInstance(objectClass, layer, x, y); const eventSheetManager = runtime.GetEventSheetManager(); eventSheetManager.BlockFlushingInstances(true); inst._TriggerOnCreated(); if (inst.IsInContainer()) for (const s of inst.siblings()) s._TriggerOnCreated(); eventSheetManager.BlockFlushingInstances(false); return inst.GetInterfaceClass() } } } ;'use strict'; { const map = new WeakMap; self.ILayout = class ILayout { constructor(layout) { map.set(this, layout); const effectInstanceArr = []; const effectList = layout.GetEffectList(); const effectCount = effectList.GetAllEffectTypes().length; for (let i = 0; i < effectCount; ++i) effectInstanceArr.push(new self.IEffectInstance(effectList,i)); Object.defineProperties(this, { name: { value: layout.GetName(), writable: false }, index: { value: layout.GetIndex(), writable: false }, effects: { value: effectInstanceArr, writable: false } }) } addEventListener(name, func) { map.get(this).UserScriptDispatcher().addEventListener(name, func) } removeEventListener(name, func) { map.get(this).UserScriptDispatcher().removeEventListener(name, func) } get width() { return map.get(this).GetWidth() } set width(w) { map.get(this).SetWidth(w) } get height() { return map.get(this).GetHeight() } set height(h) { map.get(this).SetHeight(h) } scrollTo(x, y) { const layout = map.get(this); layout.SetScrollX(x); layout.SetScrollY(y) } getLayer(nameOrIndex) { const layout = map.get(this); let layer = null; if (typeof nameOrIndex === "number" || typeof nameOrIndex === "string") layer = layout.GetLayer(nameOrIndex); else throw new TypeError("expected string or number"); if (!layer) throw new Error("invalid layer"); return layer.GetILayer() } getAllLayers() { return map.get(this).GetLayers().map(layer=>layer.GetILayer()) } } } ;'use strict'; { const C3 = self.C3; const map = new WeakMap; self.ILayer = class ILayer { constructor(layer) { map.set(this, layer); const effectInstanceArr = []; const effectList = layer.GetEffectList(); const effectCount = effectList.GetAllEffectTypes().length; for (let i = 0; i < effectCount; ++i) effectInstanceArr.push(new self.IEffectInstance(effectList,i)); Object.defineProperties(this, { name: { value: layer.GetName(), writable: false }, index: { value: layer.GetIndex(), writable: false }, layout: { value: layer.GetLayout().GetILayout(), writable: false }, effects: { value: effectInstanceArr, writable: false } }) } static _Unwrap(ilayer) { return map.get(ilayer) } get isVisible() { return map.get(this).IsVisible() } set isVisible(v) { map.get(this).SetVisible(v) } get opacity() { return map.get(this).GetOpacity() } set opacity(o) { o = C3.clamp(+o, 0, 1); if (isNaN(o)) return; map.get(this).SetOpacity(o) } getViewport() { return map.get(this).GetViewport().toDOMRect() } cssPxToLayer(clientX, clientY, z=0) { const layer = map.get(this); const runtime = layer.GetRuntime(); return layer.CanvasCssToLayer(clientX - runtime.GetCanvasClientX(), clientY - runtime.GetCanvasClientY(), z) } layerToCssPx(layerX, layerY, z=0) { const layer = map.get(this); const runtime = layer.GetRuntime(); const [clientX,clientY] = layer.LayerToCanvasCss(layerX, layerY, z); return [clientX + runtime.GetCanvasClientX(), clientY + runtime.GetCanvasClientY()] } } } ;'use strict'; { const C3 = self.C3; const map = new WeakMap; const dispatchers = new WeakMap; function GetDispatcher(iinst) { let dispatcher = dispatchers.get(iinst); if (dispatcher) return dispatcher; dispatcher = C3.New(C3.Event.Dispatcher); dispatchers.set(iinst, dispatcher); return dispatcher } let initInst = null; self.IInstance = class IInstance { constructor() { map.set(this, initInst); const descriptors = { runtime: { value: initInst.GetRuntime().GetIRuntime(), writable: false }, objectType: { value: initInst.GetObjectClass().GetIObjectClass(), writable: false }, uid: { value: initInst.GetUID(), writable: false } }; initInst._GetInstVarsScriptDescriptor(descriptors); initInst._GetBehaviorsScriptDescriptor(descriptors); Object.defineProperties(this, descriptors); initInst.GetRuntime()._MapScriptInterface(this, initInst) } static _Init(inst) { initInst = inst } static _GetInitInst() { return initInst } _Release() { const dispatcher = dispatchers.get(this); if (dispatcher) { dispatcher.Release(); dispatchers.delete(this) } map.delete(this) } addEventListener(type, func, capture) { GetDispatcher(this).addEventListener(type, func, capture) } removeEventListener(type, func, capture) { GetDispatcher(this).removeEventListener(type, func, capture) } dispatchEvent(e) { GetDispatcher(this).dispatchEvent(e) } destroy() { const inst = map.get(this); inst.GetRuntime().DestroyInstance(inst) } } } ;'use strict'; { const C3 = self.C3; const IInstance = self.IInstance; const ILayer = self.ILayer; const map = new WeakMap; const BLEND_MODE_TO_INDEX = new Map([["normal", 0], ["additive", 1], ["copy", 3], ["destination-over", 4], ["source-in", 5], ["destination-in", 6], ["source-out", 7], ["destination-out", 8], ["source-atop", 9], ["destination-atop", 10]]); const INDEX_TO_BLEND_MODE = new Map([...BLEND_MODE_TO_INDEX.entries()].map(a=>[a[1], a[0]])); const tempColor = C3.New(C3.Color); self.IWorldInstance = class IWorldInstance extends IInstance { constructor() { super(); const inst = IInstance._GetInitInst(); map.set(this, inst); const effectInstanceArr = []; const wi = inst.GetWorldInfo(); const instanceEffectList = wi.GetInstanceEffectList(); if (instanceEffectList) { const effectCount = wi.GetObjectClass().GetEffectList().GetAllEffectTypes().length; for (let i = 0; i < effectCount; ++i) effectInstanceArr.push(new self.IEffectInstance(instanceEffectList,i)) } const descriptors = { effects: { value: effectInstanceArr, writable: false } }; Object.defineProperties(this, descriptors) } get layout() { return map.get(this).GetWorldInfo().GetLayout().GetILayout() } get layer() { return map.get(this).GetWorldInfo().GetLayer().GetILayer() } get x() { return map.get(this).GetWorldInfo().GetX() } set x(v) { v = +v; const wi = map.get(this).GetWorldInfo(); if (isNaN(v) || wi.GetX() === v) return; wi.SetX(v); wi.SetBboxChanged() } get y() { return map.get(this).GetWorldInfo().GetY() } set y(v) { v = +v; const wi = map.get(this).GetWorldInfo(); if (isNaN(v) || wi.GetY() === v) return; wi.SetY(v); wi.SetBboxChanged() } get zElevation() { return map.get(this).GetWorldInfo().GetZElevation() } set zElevation(z) { z = +z; const inst = map.get(this); const wi = inst.GetWorldInfo(); if (wi.GetZElevation() === z) return; wi.SetZElevation(z); inst.GetRuntime().UpdateRender() } get totalZElevation() { return map.get(this).GetWorldInfo().GetTotalZElevation() } get width() { return map.get(this).GetWorldInfo().GetWidth() } set width(w) { w = +w; const wi = map.get(this).GetWorldInfo(); if (isNaN(w) || wi.GetWidth() === w) return; wi.SetWidth(w); wi.SetBboxChanged() } get height() { return map.get(this).GetWorldInfo().GetHeight() } set height(h) { h = +h; const wi = map.get(this).GetWorldInfo(); if (isNaN(h) || wi.GetHeight() === h) return; wi.SetHeight(h); wi.SetBboxChanged() } get angle() { return map.get(this).GetWorldInfo().GetAngle() } set angle(a) { a = C3.clampAngle(+a); const wi = map.get(this).GetWorldInfo(); if (isNaN(a) || wi.GetAngle() === a) return; wi.SetAngle(a); wi.SetBboxChanged() } get angleDegrees() { return C3.toDegrees(this.angle) } set angleDegrees(a) { this.angle = C3.toRadians(a) } getBoundingBox() { return map.get(this).GetWorldInfo().GetBoundingBox().toDOMRect() } getBoundingQuad() { return map.get(this).GetWorldInfo().GetBoundingQuad().toDOMQuad() } get isVisible() { return map.get(this).GetWorldInfo().IsVisible() } set isVisible(v) { v = !!v; const inst = map.get(this); const wi = inst.GetWorldInfo(); if (wi.IsVisible() === v) return; wi.SetVisible(v); inst.GetRuntime().UpdateRender() } get opacity() { return map.get(this).GetWorldInfo().GetOpacity() } set opacity(o) { o = C3.clamp(+o, 0, 1); const inst = map.get(this); const wi = inst.GetWorldInfo(); if (isNaN(o) || wi.GetOpacity() === o) return; wi.SetOpacity(o); inst.GetRuntime().UpdateRender() } set colorRgb(arr) { if (arr.length < 3) throw new Error("expected 3 elements"); tempColor.setRgb(arr[0], arr[1], arr[2]); const inst = map.get(this); const wi = inst.GetWorldInfo(); if (wi.GetUnpremultipliedColor().equalsIgnoringAlpha(tempColor)) return; wi.SetUnpremultipliedColor(tempColor); inst.GetRuntime().UpdateRender() } get colorRgb() { const c = map.get(this).GetWorldInfo().GetUnpremultipliedColor(); return [c.getR(), c.getG(), c.getB()] } set blendMode(bm) { const index = BLEND_MODE_TO_INDEX.get(bm); if (typeof index !== "number") throw new Error("invalid blend mode"); const inst = map.get(this); const wi = inst.GetWorldInfo(); wi.SetBlendMode(index); inst.GetRuntime().UpdateRender() } get blendMode() { return INDEX_TO_BLEND_MODE.get(map.get(this).GetWorldInfo().GetBlendMode()) } moveToTop() { map.get(this).GetWorldInfo().ZOrderMoveToTop() } moveToBottom() { map.get(this).GetWorldInfo().ZOrderMoveToBottom() } moveToLayer(ilayer) { const layer = ILayer._Unwrap(ilayer); if (!layer) throw new Error("invalid layer"); map.get(this).GetWorldInfo().ZOrderMoveToLayer(layer) } moveAdjacentToInstance(other, isAfter) { map.get(this).GetWorldInfo().ZOrderMoveAdjacentToInstance(map.get(other), isAfter) } containsPoint(x, y) { return map.get(this).GetWorldInfo().ContainsPoint(+x, +y) } testOverlap(worldInstance) { const a = map.get(this); const b = map.get(worldInstance); return a.GetRuntime().GetCollisionEngine().TestOverlap(a, b) } testOverlapSolid() { const inst = map.get(this); const overlapInst = inst.GetRuntime().GetCollisionEngine().TestOverlapSolid(inst); return overlapInst ? overlapInst.GetInterfaceClass() : null } getParent() { const parent = map.get(this).GetParent(); return parent ? parent.GetInterfaceClass() : null } getTopParent() { const parent = map.get(this).GetTopParent(); return parent ? parent.GetInterfaceClass() : null } *parents() { for (const parent of map.get(this).parents()) yield parent.GetInterfaceClass() } getChildCount() { return map.get(this).GetChildCount() } getChildAt(index) { const child = map.get(this).GetChildAt(index); return child ? child.GetInterfaceClass() : null } *children() { for (const child of map.get(this).children()) yield child.GetInterfaceClass() } *allChildren() { for (const child of map.get(this).allChildren()) yield child.GetInterfaceClass() } addChild(ichild, opts) { if (!opts) opts = {}; const inst = map.get(this); const child = map.get(ichild); inst.AddChild(child, opts) } removeChild(ichild) { const inst = map.get(this); const child = map.get(ichild); inst.RemoveChild(child) } removeFromParent() { const inst = map.get(this); if (!inst.HasParent()) return; const parent = inst.GetParent(); parent.RemoveChild(inst) } createMesh(hsize, vsize) { map.get(this).GetWorldInfo().CreateMesh(hsize, vsize) } releaseMesh() { const wi = map.get(this).GetWorldInfo(); wi.ReleaseMesh(); wi.SetBboxChanged() } setMeshPoint(col, row, opts) { const wi = map.get(this).GetWorldInfo(); if (wi.SetMeshPoint(col, row, opts)) wi.SetBboxChanged() } } } ;'use strict'; { const C3 = self.C3; const map = new WeakMap; self.IDOMInstance = class IDOMInstance extends self.IWorldInstance { constructor() { super(); map.set(this, self.IInstance._GetInitInst()) } getElement() { return map.get(this).GetSdkInstance()._GetElementInDOMMode() } focus() { map.get(this).GetSdkInstance().FocusElement() } blur() { map.get(this).GetSdkInstance().BlurElement() } setCssStyle(prop, val) { map.get(this).GetSdkInstance().SetElementCSSStyle(prop, val) } } } ;'use strict'; { const C3 = self.C3; const map = new WeakMap; const dispatchers = new WeakMap; function GetDispatcher(ibehinst) { let dispatcher = dispatchers.get(ibehinst); if (dispatcher) return dispatcher; dispatcher = C3.New(C3.Event.Dispatcher); dispatchers.set(ibehinst, dispatcher); return dispatcher } let initBehInst = null; self.IBehaviorInstance = class IBehaviorInstance { constructor() { map.set(this, initBehInst); const descriptors = { runtime: { value: initBehInst.GetRuntime().GetIRuntime(), writable: false }, behavior: { value: initBehInst.GetBehavior().GetIBehavior(), writable: false } }; Object.defineProperties(this, descriptors) } static _Init(behInst) { initBehInst = behInst } static _GetInitInst() { return initBehInst } get instance() { return map.get(this).GetObjectInstance().GetInterfaceClass() } _Release() { const dispatcher = dispatchers.get(this); if (dispatcher) { dispatcher.Release(); dispatchers.delete(this) } map.delete(this) } addEventListener(type, func, capture) { GetDispatcher(this).addEventListener(type, func, capture) } removeEventListener(type, func, capture) { GetDispatcher(this).removeEventListener(type, func, capture) } dispatchEvent(e) { GetDispatcher(this).dispatchEvent(e) } } } ;'use strict'; { const map = new WeakMap; self.IBehavior = class IBehavior { constructor(behavior) { map.set(this, behavior); const descriptors = { runtime: { value: behavior.GetRuntime().GetIRuntime(), writable: false } }; Object.defineProperties(this, descriptors) } getAllInstances() { return map.get(this).GetInstances().map(inst=>inst.GetInterfaceClass()) } } } ;'use strict'; { const C3 = self.C3; const map = new WeakMap; self.IEffectInstance = class IEffectInstance { constructor(effectList, index) { map.set(this, effectList); const descriptors = { index: { value: index, writable: false } }; Object.defineProperties(this, descriptors) } get name() { const effectTypes = map.get(this).GetAllEffectTypes(); return effectTypes[this.index].GetName() } get isActive() { return map.get(this).IsEffectIndexActive(this.index) } set isActive(a) { a = !!a; const fxList = map.get(this); if (fxList.IsEffectIndexActive(this.index) === a) return; fxList.SetEffectIndexActive(this.index, a); fxList.UpdateActiveEffects(); fxList.GetRuntime().UpdateRender() } setParameter(i, v) { i = Math.floor(+i); const fxList = map.get(this); const paramsArr = fxList.GetEffectParametersForIndex(this.index); if (i < 0 || i >= paramsArr.length) throw new RangeError("invalid effect parameter index"); const oldValue = paramsArr[i]; if (oldValue instanceof C3.Color) { if (!Array.isArray(v) || v.length < 3) throw new TypeError("expected array with 3 elements"); const r = v[0]; const g = v[1]; const b = v[2]; if (oldValue.equalsRgb(r, g, b)) return; oldValue.setRgb(r, g, b) } else { if (typeof v !== "number") throw new TypeError("expected number"); if (oldValue === v) return; paramsArr[i] = v } if (fxList.IsEffectIndexActive(this.index)) fxList.GetRuntime().UpdateRender() } getParameter(i) { i = Math.floor(+i); const fxList = map.get(this); const paramsArr = fxList.GetEffectParametersForIndex(this.index); if (i < 0 || i >= paramsArr.length) throw new RangeError("invalid effect parameter index"); const ret = paramsArr[i]; if (ret instanceof C3.Color) return [ret.getR(), ret.getG(), ret.getB()]; else return ret } } } ;'use strict'; { const C3 = self.C3; const VALID_LOAD_POLICIES = new Set(["local", "remote"]); const EXT_TO_TYPE = new Map([["mp4", "video/mp4"], ["webm", "video/webm"], ["m4a", "audio/mp4"], ["mp3", "audio/mpeg"], ["js", "application/javascript"], ["wasm", "application/wasm"], ["svg", "image/svg+xml"], ["html", "text/html"]]); function GetTypeFromFileExtension(filename) { if (!filename) return ""; const parts = filename.split("."); if (parts.length < 2) return ""; const ext = parts[parts.length - 1].toLowerCase(); return EXT_TO_TYPE.get(ext) || "" } function AddScript(url) { return new Promise((resolve,reject)=>{ const elem = document.createElement("script"); elem.onload = resolve; elem.onerror = reject; elem.async = false; elem.src = url; document.head.appendChild(elem) } ) } C3.AssetManager = class AssetManager extends C3.DefendedBase { constructor(runtime, opts) { super(); if (!VALID_LOAD_POLICIES.has(opts.defaultLoadPolicy)) throw new Error("invalid load policy"); this._runtime = runtime; this._localUrlBlobs = new Map; this._localBlobUrlCache = new Map; this._isCordova = !!opts.isCordova; this._isiOSCordova = !!opts.isiOSCordova; this._isFileProtocol = location.protocol === "file:"; this._supportedAudioFormats = opts.supportedAudioFormats || {}; this._audioFiles = new Map; this._preloadSounds = false; this._mediaSubfolder = ""; this._fontsSubfolder = ""; this._iconsSubfolder = ""; this._defaultLoadPolicy = opts.defaultLoadPolicy; this._allAssets = []; this._assetsByUrl = new Map; this._webFonts = []; this._loadPromises = []; this._hasFinishedInitialLoad = false; this._totalAssetSizeToLoad = 0; this._assetSizeLoaded = 0; this._lastLoadProgress = 0; this._hasHadErrorLoading = false; this._loadingRateLimiter = C3.New(C3.RateLimiter, ()=>this._FireLoadingProgressEvent(), 50); this._promiseThrottle = new C3.PromiseThrottle(Math.max(C3.hardwareConcurrency, 8)); if (opts.localUrlBlobs) for (const [url,blob] of Object.entries(opts.localUrlBlobs)) this._localUrlBlobs.set(url.toLowerCase(), blob); this._iAssetManager = new self.IAssetManager(this) } Release() { this._localUrlBlobs.clear(); for (const url of this._localBlobUrlCache.values()) URL.revokeObjectURL(url); this._localBlobUrlCache.clear(); for (const asset of this._allAssets) asset.Release(); C3.clearArray(this._allAssets); this._assetsByUrl.clear(); C3.clearArray(this._loadPromises); this._runtime = null } GetRuntime() { return this._runtime } _SetMediaSubfolder(folder) { this._mediaSubfolder = folder } GetMediaSubfolder() { return this._mediaSubfolder } _SetFontsSubfolder(folder) { this._fontsSubfolder = folder } GetFontsSubfolder() { return this._fontsSubfolder } _SetIconsSubfolder(folder) { this._iconsSubfolder = folder } GetIconsSubfolder() { return this._iconsSubfolder } _HasLocalUrlBlob(url) { return this._localUrlBlobs.has(url.toLowerCase()) } _GetLocalUrlBlob(url) { return this._localUrlBlobs.get(url.toLowerCase()) || null } GetLocalUrlAsBlobUrl(url) { const blob = this._GetLocalUrlBlob(url); if (!blob) return url; let ret = this._localBlobUrlCache.get(blob); if (!ret) { ret = URL.createObjectURL(blob); this._localBlobUrlCache.set(blob, ret) } return ret } FetchBlob(url, loadPolicy) { loadPolicy = loadPolicy || this._defaultLoadPolicy; const localBlob = this._GetLocalUrlBlob(url); if (localBlob) return Promise.resolve(localBlob); else if (C3.IsRelativeURL(url)) { const lowerUrl = url.toLowerCase(); if (this._isCordova && this._isFileProtocol) return this.CordovaFetchLocalFileAsBlob(lowerUrl); else if (loadPolicy === "local") return this._promiseThrottle.Add(()=>C3.FetchBlob(lowerUrl)); else return C3.FetchBlob(lowerUrl) } else return C3.FetchBlob(url) } FetchArrayBuffer(url) { const localBlob = this._GetLocalUrlBlob(url); if (localBlob) return C3.BlobToArrayBuffer(localBlob); else if (C3.IsRelativeURL(url)) { const lowerUrl = url.toLowerCase(); if (this._isCordova && this._isFileProtocol) return this.CordovaFetchLocalFileAsArrayBuffer(lowerUrl); else if (this._defaultLoadPolicy === "local") return this._promiseThrottle.Add(()=>C3.FetchArrayBuffer(lowerUrl)); else return C3.FetchArrayBuffer(lowerUrl) } else return C3.FetchArrayBuffer(url) } FetchText(url) { const localBlob = this._GetLocalUrlBlob(url); if (localBlob) return C3.BlobToString(localBlob); else if (C3.IsRelativeURL(url)) { const lowerUrl = url.toLowerCase(); if (this._isCordova && this._isFileProtocol) return this.CordovaFetchLocalFileAsText(lowerUrl); else if (this._defaultLoadPolicy === "local") return this._promiseThrottle.Add(()=>C3.FetchText(lowerUrl)); else return C3.FetchText(lowerUrl) } else return C3.FetchText(url) } async FetchJson(url) { const text = await this.FetchText(url); return JSON.parse(text) } _CordovaFetchLocalFileAs(filename, as_) { return this._runtime.PostComponentMessageToDOMAsync("runtime", "cordova-fetch-local-file", { "filename": filename, "as": as_ }) } CordovaFetchLocalFileAsText(filename) { return this._CordovaFetchLocalFileAs(filename, "text") } async CordovaFetchLocalFileAsBlob(filename) { const buffer = await this._CordovaFetchLocalFileAs(filename, "buffer"); const type = GetTypeFromFileExtension(filename); return new Blob([buffer],{ "type": type }) } async CordovaFetchLocalFileAsBlobURL(filename) { filename = filename.toLowerCase(); let blobUrl = this._localBlobUrlCache.get(filename); if (blobUrl) return blobUrl; const blob = await this.CordovaFetchLocalFileAsBlob(filename); blobUrl = URL.createObjectURL(blob); this._localBlobUrlCache.set(filename, blobUrl); return blobUrl } CordovaFetchLocalFileAsArrayBuffer(filename) { return this._CordovaFetchLocalFileAs(filename, "buffer") } GetMediaFileUrl(filename) { if (this._HasLocalUrlBlob(filename)) return this.GetLocalUrlAsBlobUrl(filename); else return this._mediaSubfolder + filename.toLowerCase() } GetProjectFileUrl(url, subfolder="") { if (C3.IsAbsoluteURL(url)) { if (subfolder) throw new Error("cannot specify subfolder with remote URL"); return Promise.resolve(url) } else if (this._HasLocalUrlBlob(url)) return Promise.resolve(this.GetLocalUrlAsBlobUrl(url)); else if (this._isCordova && this._isFileProtocol) return this.CordovaFetchLocalFileAsBlobURL(subfolder + url); else return Promise.resolve(subfolder + url.toLowerCase()) } LoadProjectFileUrl(url) { return this.GetProjectFileUrl(url) } LoadImage(opts) { if (opts.loadPolicy && !VALID_LOAD_POLICIES.has(opts.loadPolicy)) throw new Error("invalid load policy"); let asset = this._assetsByUrl.get(opts.url); if (asset) return asset; asset = C3.New(C3.ImageAsset, this, { url: opts.url, size: opts.size || 0, loadPolicy: opts.loadPolicy || this._defaultLoadPolicy }); this._allAssets.push(asset); this._assetsByUrl.set(asset.GetURL(), asset); if (!this._hasFinishedInitialLoad) { this._totalAssetSizeToLoad += asset.GetSize(); this._loadPromises.push(asset.Load().then(()=>this._AddLoadedSize(asset.GetSize()))) } return asset } async WaitForAllToLoad() { try { await Promise.all(this._loadPromises); this._lastLoadProgress = 1 } catch (err) { console.error("Error loading: ", err); this._hasHadErrorLoading = true; this._FireLoadingProgressEvent() } } SetInitialLoadFinished() { this._hasFinishedInitialLoad = true } HasHadErrorLoading() { return this._hasHadErrorLoading } _AddLoadedSize(s) { this._assetSizeLoaded += s; this._loadingRateLimiter.Call() } _FireLoadingProgressEvent() { const event = C3.New(C3.Event, "loadingprogress"); this._lastLoadProgress = C3.clamp(this._assetSizeLoaded / this._totalAssetSizeToLoad, 0, 1); event.progress = this._lastLoadProgress; this._runtime.Dispatcher().dispatchEvent(event) } GetLoadProgress() { return this._lastLoadProgress } _SetWebFonts(arr) { C3.shallowAssignArray(this._webFonts, arr); if (this._webFonts.length) this._loadPromises.push(this._LoadWebFonts()) } _LoadWebFonts() { if (typeof FontFace === "undefined") return Promise.resolve(); const promises = []; for (const [name,filename,size] of this._webFonts) { this._totalAssetSizeToLoad += size; promises.push(this._LoadWebFont(name, filename).then(()=>this._AddLoadedSize(size))) } return Promise.all(promises) } async _LoadWebFont(name, filename) { try { const url = await this.GetProjectFileUrl(filename, this._fontsSubfolder); const fontFace = new FontFace(name,`url('${url}')`); if (this._runtime.IsInWorker()) self.fonts.add(fontFace); else document.fonts.add(fontFace); await fontFace.load() } catch (err) { console.warn(`[C3 runtime] Failed to load web font '${name}': `, err) } } IsAudioFormatSupported(type) { return !!this._supportedAudioFormats[type] } _SetAudioFiles(arr, preloadSounds) { this._preloadSounds = !!preloadSounds; for (const [fileName,projectFilesInfo,isMusic] of arr) this._audioFiles.set(fileName, { fileName, formats: projectFilesInfo.map(si=>({ type: si[0], fileExtension: si[1], fullName: fileName + si[1], fileSize: si[2] })), isMusic }) } GetPreferredAudioFile(namePart) { const info = this._audioFiles.get(namePart.toLowerCase()); if (!info) return null; let webMOpusFile = null; for (const formatInfo of info.formats) { if (!webMOpusFile && formatInfo.type === "audio/webm; codecs=opus") webMOpusFile = formatInfo; if (this.IsAudioFormatSupported(formatInfo.type)) return formatInfo } return webMOpusFile } GetProjectAudioFileUrl(namePart) { const formatInfo = this.GetPreferredAudioFile(namePart); if (!formatInfo) return null; return { url: this.GetMediaFileUrl(formatInfo.fullName), type: formatInfo.type } } GetAudioToPreload() { if (this._preloadSounds) { const ret = []; for (const info of this._audioFiles.values()) { if (info.isMusic) continue; const formatInfo = this.GetPreferredAudioFile(info.fileName); if (!formatInfo) continue; ret.push({ originalUrl: info.fileName, url: this.GetMediaFileUrl(formatInfo.fullName), type: formatInfo.type, fileSize: formatInfo.fileSize }) } return ret } else return [] } GetIAssetManager() { return this._iAssetManager } async LoadScripts(...urls) { const scriptUrls = await Promise.all(urls.map(url=>this.GetProjectFileUrl(url))); if (this._runtime.IsInWorker()) importScripts(...scriptUrls); else await Promise.all(scriptUrls.map(url=>AddScript(url))) } async CompileWebAssembly(url) { if (WebAssembly.compileStreaming) { const fetchUrl = await this.GetProjectFileUrl(url); return await WebAssembly.compileStreaming(fetch(fetchUrl)) } else { const arrayBuffer = await C3.FetchArrayBuffer(url); return await WebAssembly.compile(arrayBuffer) } } async LoadStyleSheet(url) { const fetchUrl = await this.GetProjectFileUrl(url); return await this._runtime.PostComponentMessageToDOMAsync("runtime", "add-stylesheet", { "url": fetchUrl }) } } } ;'use strict'; { const C3 = self.C3; C3.Asset = class Asset extends C3.DefendedBase { constructor(assetManager, opts) { super(); this._assetManager = assetManager; this._runtime = assetManager.GetRuntime(); this._url = opts.url; this._size = opts.size; this._loadPolicy = opts.loadPolicy; this._blob = null; this._isLoaded = false; this._loadPromise = null } Release() { this._loadPromise = null; this._assetManager = null; this._runtime = null; this._blob = null } GetURL() { return this._url } GetSize() { return this._size } Load() { if (this._loadPolicy === "local" || this._blob) { this._isLoaded = true; return Promise.resolve() } if (this._loadPromise) return this._loadPromise; this._loadPromise = this._assetManager.FetchBlob(this._url, this._loadPolicy).then(blob=>{ this._isLoaded = true; this._loadPromise = null; this._blob = blob } ).catch(err=>console.error("Error loading resource: ", err)); return this._loadPromise } IsLoaded() { return this._isLoaded } GetBlob() { if (this._blob) return Promise.resolve(this._blob); return this._assetManager.FetchBlob(this._url, this._loadPolicy) } } } ;'use strict'; { const C3 = self.C3; const promiseThrottle = new C3.PromiseThrottle; const allImageAssets = new Set; C3.ImageAsset = class ImageAsset extends C3.Asset { constructor(assetManager, opts) { super(assetManager, opts); this._texturePromise = null; this._webglTexture = null; this._refCount = 0; this._imageWidth = -1; this._imageHeight = -1; allImageAssets.add(this) } Release() { this.ReleaseTexture(); if (this._refCount !== 0) throw new Error("released image asset which still has texture references"); this._texturePromise = null; allImageAssets.delete(this); super.Release() } static OnWebGLContextLost() { for (const imageAsset of allImageAssets) { imageAsset._texturePromise = null; imageAsset._webglTexture = null; imageAsset._refCount = 0 } } LoadStaticTexture(renderer, opts) { this._refCount++; if (this._webglTexture) return Promise.resolve(this._webglTexture); if (this._texturePromise) return this._texturePromise; this._texturePromise = this.GetBlob().then(blob=>promiseThrottle.Add(()=>renderer.CreateStaticTextureAsync(blob, opts).then(texture=>{ this._texturePromise = null; if (this._refCount === 0) { renderer.DeleteTexture(texture); return null } this._webglTexture = texture; this._imageWidth = texture.GetWidth(); this._imageHeight = texture.GetHeight(); return this._webglTexture } ))).catch(err=>{ console.error("Failed to load texture: ", err); throw err; } ); return this._texturePromise } ReleaseTexture() { if (this._refCount <= 0) throw new Error("texture released too many times"); this._refCount--; if (this._refCount === 0 && this._webglTexture) { const renderer = this._webglTexture.GetRenderer(); renderer.DeleteTexture(this._webglTexture); this._webglTexture = null } } GetTexture() { return this._webglTexture } GetWidth() { return this._imageWidth } GetHeight() { return this._imageHeight } async LoadToDrawable() { const blob = await this.GetBlob(); if (C3.Supports.ImageBitmapOptions) return await createImageBitmap(blob, { "premultiplyAlpha": "none" }); else if (C3.Supports.ImageBitmap) return await createImageBitmap(blob); else return await C3.BlobToImage(blob) } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; function SortByInstLastCachedZIndex(a, b) { return a.GetWorldInfo()._GetLastCachedZIndex() - b.GetWorldInfo()._GetLastCachedZIndex() } C3.RenderCell = class RenderCell extends C3.DefendedBase { constructor(grid, x, y) { super(); this._grid = grid; this._x = x; this._y = y; this._instances = []; this._isSorted = true; this._pendingRemoval = new Set; this._isAnyPendingRemoval = false } Release() { C3.clearArray(this._instances); this._pendingRemoval.clear(); this._grid = null } Reset() { C3.clearArray(this._instances); this._isSorted = true; this._pendingRemoval.clear(); this._isAnyPendingRemoval = false } SetChanged() { this._isSorted = false } IsEmpty() { if (!this._instances.length) return true; if (this._instances.length > this._pendingRemoval.size) return false; this._FlushPending(); return true } Insert(inst) { if (this._pendingRemoval.has(inst)) { this._pendingRemoval.delete(inst); if (this._pendingRemoval.size === 0) this._isAnyPendingRemoval = false; return } this._instances.push(inst); this._isSorted = this._instances.length === 1 } Remove(inst) { this._pendingRemoval.add(inst); this._isAnyPendingRemoval = true; if (this._pendingRemoval.size >= 50) this._FlushPending() } _FlushPending() { if (!this._isAnyPendingRemoval) return; if (this._instances.length === this._pendingRemoval.size) { this.Reset(); return } C3.arrayRemoveAllInSet(this._instances, this._pendingRemoval); this._pendingRemoval.clear(); this._isAnyPendingRemoval = false } _EnsureSorted() { if (this._isSorted) return; this._instances.sort(SortByInstLastCachedZIndex); this._isSorted = true } Dump(result) { this._FlushPending(); this._EnsureSorted(); if (this._instances.length) result.push(this._instances) } } } ;'use strict'; { const C3 = self.C3; C3.RenderGrid = class RenderGrid extends C3.DefendedBase { constructor(cellWidth, cellHeight) { super(); this._cellWidth = cellWidth; this._cellHeight = cellHeight; this._cells = C3.New(C3.PairMap) } Release() { this._cells.Release(); this._cells = null } GetCell(x, y, createIfMissing) { let ret = this._cells.Get(x, y); if (ret) return ret; else if (createIfMissing) { ret = C3.New(C3.RenderCell, this, x, y); this._cells.Set(x, y, ret); return ret } else return null } XToCell(x) { return Math.floor(x / this._cellWidth) } YToCell(y) { return Math.floor(y / this._cellHeight) } Update(inst, oldRange, newRange) { if (oldRange) for (let x = oldRange.getLeft(), lenx = oldRange.getRight(); x <= lenx; ++x) for (let y = oldRange.getTop(), leny = oldRange.getBottom(); y <= leny; ++y) { if (newRange && newRange.containsPoint(x, y)) continue; const cell = this.GetCell(x, y, false); if (!cell) continue; cell.Remove(inst); if (cell.IsEmpty()) this._cells.Delete(x, y) } if (newRange) for (let x = newRange.getLeft(), lenx = newRange.getRight(); x <= lenx; ++x) for (let y = newRange.getTop(), leny = newRange.getBottom(); y <= leny; ++y) { if (oldRange && oldRange.containsPoint(x, y)) continue; this.GetCell(x, y, true).Insert(inst) } } QueryRange(rc, result) { let x = this.XToCell(rc.getLeft()); const ystart = this.YToCell(rc.getTop()); const lenx = this.XToCell(rc.getRight()); const leny = this.YToCell(rc.getBottom()); for (; x <= lenx; ++x) for (let y = ystart; y <= leny; ++y) { const cell = this.GetCell(x, y, false); if (!cell) continue; cell.Dump(result) } } MarkRangeChanged(rc) { let x = rc.getLeft(); const ystart = rc.getTop(); const lenx = rc.getRight(); const leny = rc.getBottom(); for (; x <= lenx; ++x) for (let y = ystart; y <= leny; ++y) { const cell = this.GetCell(x, y, false); if (!cell) continue; cell.SetChanged() } } } } ;'use strict'; { const C3 = self.C3; const tmpRect = new C3.Rect; const tmpQuad = new C3.Quad; const renderCellArr = []; const tmpDestRect = new C3.Rect; const tmpSrcRect = new C3.Rect; const glMatrix = self.glMatrix; const vec3 = glMatrix.vec3; const tempVec3 = vec3.fromValues(0, 1, 0); function SortByInstLastCachedZIndex(a, b) { return a.GetWorldInfo()._GetLastCachedZIndex() - b.GetWorldInfo()._GetLastCachedZIndex() } function SortByInstZElevation(a, b) { return a.GetWorldInfo().GetZElevation() - b.GetWorldInfo().GetZElevation() } C3.Layer = class Layer extends C3.DefendedBase { constructor(layout, index, data) { super(); this._layout = layout; this._runtime = layout.GetRuntime(); this._name = data[0]; this._index = index; this._sid = data[2]; this._isVisible = !!data[3]; this._backgroundColor = C3.New(C3.Color); this._backgroundColor.setFromJSON(data[4].map(x=>x / 255)); this._isTransparent = !!data[5]; this._parallaxX = data[6]; this._parallaxY = data[7]; this._color = C3.New(C3.Color, 1, 1, 1, data[8]); this._premultipliedColor = C3.New(C3.Color); this._isForceOwnTexture = data[9]; this._useRenderCells = data[10]; this._scaleRate = data[11]; this._blendMode = data[12]; this._curRenderTarget = null; this._scale = 1; this._zElevation = data[16]; this._angle = 0; this._isAngleEnabled = true; this._viewport = C3.New(C3.Rect); this._viewportZ0 = C3.New(C3.Rect); this._startupInitialInstances = []; this._initialInstances = []; this._createdGlobalUids = []; this._instances = []; this._zIndicesUpToDate = false; this._anyInstanceZElevated = false; this._effectList = C3.New(C3.EffectList, this, data[15]); this._renderGrid = null; this._lastRenderList = []; this._isRenderListUpToDate = false; this._lastRenderCells = C3.New(C3.Rect, 0, 0, -1, -1); this._curRenderCells = C3.New(C3.Rect, 0, 0, -1, -1); this._iLayer = new self.ILayer(this); this._UpdatePremultipliedColor(); if (this._useRenderCells) this._renderGrid = C3.New(C3.RenderGrid, this._runtime.GetOriginalViewportWidth(), this._runtime.GetOriginalViewportHeight()); for (const instData of data[14]) { const objectClass = this._runtime.GetObjectClassByIndex(instData[1]); this._layout._AddInitialObjectClass(objectClass); if (!objectClass.GetDefaultInstanceData()) { objectClass.SetDefaultInstanceData(instData); objectClass._SetDefaultLayerIndex(this._index) } this._initialInstances.push(instData) } C3.shallowAssignArray(this._startupInitialInstances, this._initialInstances) } static Create(layout, index, data) { return C3.New(C3.Layer, layout, index, data) } Release() { this._layout = null; this._runtime = null } CreateInitialInstances(createdInstances) { const isFirstVisit = this._layout.IsFirstVisit(); let k = 0; const initialInstances = this._initialInstances; for (let i = 0, len = initialInstances.length; i < len; ++i) { const instData = initialInstances[i]; const objectClass = this._runtime.GetObjectClassByIndex(instData[1]); let keep = true; if (!objectClass.HasPersistBehavior() || isFirstVisit) { const inst = this._runtime.CreateInstanceFromData(instData, this, true); createdInstances.push(inst); if (objectClass.IsGlobal()) { keep = false; this._createdGlobalUids.push(inst.GetUID()) } } if (keep) { initialInstances[k] = initialInstances[i]; ++k } } C3.truncateArray(initialInstances, k); this._runtime.FlushPendingInstances(); this.SetZIndicesChanged() } _AddInstance(inst, addToGrid) { const wi = inst.GetWorldInfo(); if (wi.GetLayer() !== this) throw new Error("instance added to wrong layer"); this._instances.push(inst); if (wi.GetZElevation() !== 0) this._anyInstanceZElevated = true; if (addToGrid && this._useRenderCells) inst.GetWorldInfo().SetBboxChanged(); this.SetZIndicesChanged() } _MaybeAddInstance(inst) { if (this._instances.includes(inst)) return; this._instances.push(inst); if (inst.GetWorldInfo().GetZElevation() !== 0) this._anyInstanceZElevated = true; this.SetZIndicesChanged() } _PrependInstance(inst, addToGrid) { const wi = inst.GetWorldInfo(); if (wi.GetLayer() !== this) throw new Error("instance added to wrong layer"); this._instances.unshift(inst); if (wi.GetZElevation() !== 0) this._anyInstanceZElevated = true; this.SetZIndicesChanged(); if (addToGrid && this._useRenderCells) inst.GetWorldInfo().SetBboxChanged() } _RemoveInstance(inst, removeFromGrid) { const index = this._instances.indexOf(inst); if (index < 0) return; if (removeFromGrid && this._useRenderCells) inst.GetWorldInfo()._RemoveFromRenderCells(); this._instances.splice(index, 1); this.SetZIndicesChanged(); this._MaybeResetAnyInstanceZElevatedFlag() } _SetAnyInstanceZElevated() { this._anyInstanceZElevated = true } _MaybeResetAnyInstanceZElevatedFlag() { if (this._instances.length === 0) this._anyInstanceZElevated = false } _SortInstancesByLastCachedZIndex(isPersistMode) { if (isPersistMode) { const assignedZIndices = new Set; for (const inst of this._instances) { const cachedZIndex = inst.GetWorldInfo()._GetLastCachedZIndex(); if (cachedZIndex >= 0) assignedZIndices.add(cachedZIndex) } let index = -1; for (const inst of this._instances) { const wi = inst.GetWorldInfo(); if (wi._GetLastCachedZIndex() >= 0) continue; ++index; while (assignedZIndices.has(index)) ++index; wi._SetZIndex(index) } } this._instances.sort(SortByInstLastCachedZIndex) } _Start() {} _End() { for (const inst of this._instances) if (!inst.GetObjectClass().IsGlobal()) this._runtime.DestroyInstance(inst); this._runtime.FlushPendingInstances(); C3.clearArray(this._instances); this._anyInstanceZElevated = false; this.SetZIndicesChanged() } RecreateInitialObjects(objectClass, rc, offsetX, offsetY) { const eventSheetManager = this._runtime.GetEventSheetManager(); const allObjectClasses = this._runtime.GetAllObjectClasses(); const isFamily = objectClass.IsFamily(); const ret = []; for (const instData of this._initialInstances) { const worldData = instData[0]; const x = worldData[0]; const y = worldData[1]; if (!rc.containsPoint(x, y)) continue; const objectType = allObjectClasses[instData[1]]; if (objectType !== objectClass) if (isFamily) { if (!objectClass.FamilyHasMember(objectType)) continue } else continue; let createOnLayer = this; const runningLayout = this._runtime.GetCurrentLayout(); if (this.GetLayout() !== runningLayout) { createOnLayer = runningLayout.GetLayerByName(this.GetName()); if (!createOnLayer) createOnLayer = runningLayout.GetLayerByIndex(this.GetIndex()) } const inst = this._runtime.CreateInstanceFromData(instData, createOnLayer, false); const wi = inst.GetWorldInfo(); wi.OffsetXY(offsetX, offsetY); wi.SetBboxChanged(); eventSheetManager.BlockFlushingInstances(true); inst._TriggerOnCreated(); if (inst.IsInContainer()) for (const s of inst.siblings()) s._TriggerOnCreated(); eventSheetManager.BlockFlushingInstances(false); ret.push(inst) } return ret } GetInstanceCount() { return this._instances.length } GetLayout() { return this._layout } GetName() { return this._name } GetIndex() { return this._index } GetSID() { return this._sid } GetRuntime() { return this._runtime } GetDevicePixelRatio() { return this._runtime.GetDevicePixelRatio() } GetEffectList() { return this._effectList } UsesRenderCells() { return this._useRenderCells } GetRenderGrid() { return this._renderGrid } SetRenderListStale() { this._isRenderListUpToDate = false } IsVisible() { return this._isVisible } SetVisible(v) { v = !!v; if (this._isVisible === v) return; this._isVisible = v; this._runtime.UpdateRender() } GetViewport() { return this._viewport } GetViewportForZ(z, outRect) { const viewportZ0 = this._viewportZ0; if (z === 0) outRect.copy(viewportZ0); else { const scaleFactor = this.Get2DScaleFactorToZ(z); const midX = viewportZ0.midX(); const midY = viewportZ0.midY(); const halfW = .5 * viewportZ0.width() / scaleFactor; const halfH = .5 * viewportZ0.height() / scaleFactor; outRect.set(midX - halfW, midY - halfH, midX + halfW, midY + halfH) } } GetOpacity() { return this._color.getA() } SetOpacity(o) { o = C3.clamp(o, 0, 1); if (this._color.getA() === o) return; this._color.setA(o); this._UpdatePremultipliedColor(); this._runtime.UpdateRender() } _UpdatePremultipliedColor() { this._premultipliedColor.copy(this._color); this._premultipliedColor.premultiply() } GetPremultipliedColor() { return this._premultipliedColor } HasDefaultColor() { return this._color.equalsRgba(1, 1, 1, 1) } GetScaleRate() { return this._scaleRate } SetScaleRate(r) { if (this._scaleRate === r) return; this._scaleRate = r; this._runtime.UpdateRender() } GetParallaxX() { return this._parallaxX } GetParallaxY() { return this._parallaxY } SetParallax(px, py) { if (this._parallaxX === px && this._parallaxY === py) return; this._parallaxX = px; this._parallaxY = py; this._runtime.UpdateRender(); if (this._parallaxX !== 1 || this._parallaxY !== 1) for (const inst of this._instances) inst.GetObjectClass()._SetAnyInstanceParallaxed(true) } SetParallaxX(px) { this.SetParallax(px, this.GetParallaxY()) } SetParallaxY(py) { this.SetParallax(this.GetParallaxX(), py) } SetZElevation(z) { z = +z; if (this._zElevation === z) return; this._zElevation = z; this._runtime.UpdateRender() } GetZElevation() { return this._zElevation } SetAngle(a) { this._angle = C3.clampAngle(a) } GetAngle() { if (this._isAngleEnabled) return C3.clampAngle(this._layout.GetAngle() + this._angle); else return 0 } GetOwnAngle() { return this._angle } HasInstances() { return this._instances.length > 0 } _GetInstances() { return this._instances } GetBackgroundColor() { return this._backgroundColor } IsTransparent() { return this._isTransparent } SetTransparent(t) { this._isTransparent = !!t } IsForceOwnTexture() { return this._isForceOwnTexture } SetForceOwnTexture(f) { this._isForceOwnTexture = !!f } SetBlendMode(bm) { if (this._blendMode === bm) return; this._blendMode = bm; this._runtime.UpdateRender() } GetBlendMode() { return this._blendMode } IsTransformCompatibleWith(otherLayer) { return this === otherLayer || this._parallaxX === otherLayer._parallaxX && this._parallaxY === otherLayer._parallaxY && this._scale === otherLayer._scale && this._scaleRate === otherLayer._scaleRate && this._angle === otherLayer._angle } _RemoveAllInstancesInSet(s) { if (s.size === 0) return; const numRemoved = C3.arrayRemoveAllInSet(this._instances, s); if (numRemoved > 0) { this._MaybeResetAnyInstanceZElevatedFlag(); this.SetZIndicesChanged() } } SetZIndicesChanged() { this._zIndicesUpToDate = false; this._isRenderListUpToDate = false } _UpdateZIndices() { if (this._zIndicesUpToDate) return; this._instances.sort(SortByInstZElevation); if (this._useRenderCells) for (let i = 0, len = this._instances.length; i < len; ++i) { const wi = this._instances[i].GetWorldInfo(); wi._SetZIndex(i); this._renderGrid.MarkRangeChanged(wi.GetRenderCellRange()) } else for (let i = 0, len = this._instances.length; i < len; ++i) this._instances[i].GetWorldInfo()._SetZIndex(i); this._zIndicesUpToDate = true } MoveInstanceAdjacent(inst, other, isAfter) { const instWi = inst.GetWorldInfo(); const otherWi = other.GetWorldInfo(); if (instWi.GetLayer() !== this || otherWi.GetLayer() !== this) throw new Error("can't arrange Z order unless both objects on this layer"); const myZ = instWi.GetZIndex(); let insertZ = otherWi.GetZIndex(); if (myZ === insertZ + (isAfter ? 1 : -1)) return false; C3.arrayRemove(this._instances, myZ); if (myZ < insertZ) insertZ--; if (isAfter) insertZ++; if (insertZ === this._instances.length) this._instances.push(inst); else this._instances.splice(insertZ, 0, inst); this.SetZIndicesChanged(); return true } _MergeSortedZArrays(a, b) { const ret = []; let i = 0 , j = 0 , lena = a.length , lenb = b.length; while (i < lena && j < lenb) { const ai = a[i]; const bj = b[j]; if (ai.GetWorldInfo()._GetLastCachedZIndex() < bj.GetWorldInfo()._GetLastCachedZIndex()) { ret.push(ai); ++i } else { ret.push(bj); ++j } } for (; i < lena; ++i) ret.push(a[i]); for (; j < lenb; ++j) ret.push(b[j]); return ret } _MergeAllSortedZArrays_pass(arr) { const ret = []; const len = arr.length; for (let i = 0; i < len - 1; i += 2) { const arr1 = arr[i]; const arr2 = arr[i + 1]; ret.push(this._MergeSortedZArrays(arr1, arr2)) } if (len % 2 === 1) ret.push(arr[len - 1]); return ret } _MergeAllSortedZArrays(arr) { while (arr.length > 1) arr = this._MergeAllSortedZArrays_pass(arr); return arr[0] } _GetRenderCellInstancesToDraw() { this._UpdateZIndices(); C3.clearArray(renderCellArr); this._renderGrid.QueryRange(this._viewport, renderCellArr); if (!renderCellArr.length) return []; if (renderCellArr.length === 1) return renderCellArr[0]; return this._MergeAllSortedZArrays(renderCellArr) } _IsOpaque() { return !this.UsesOwnTexture() && !this.IsTransparent() } ShouldDraw() { return this.IsVisible() && this.GetOpacity() > 0 && (this.HasInstances() || !this.IsTransparent()) } UsesOwnTexture() { return this.IsForceOwnTexture() || !this.HasDefaultColor() || this.GetBlendMode() !== 0 || this._effectList.HasAnyActiveEffect() } GetRenderTarget() { return this._curRenderTarget } _CanFastPathDrawLayer(activeEffectTypes) { if (activeEffectTypes.length === 0) return true; if (activeEffectTypes.length >= 2) return false; const effectType = activeEffectTypes[0]; const shaderProgram = effectType.GetShaderProgram(); return !shaderProgram.MustPreDraw() && !shaderProgram.UsesDest() && !shaderProgram.UsesCrossSampling() && this.HasDefaultColor() } Get2DScaleFactorToZ(z) { const camZ = this.GetCameraZ(); return camZ / (camZ - z) } GetCameraZ() { return 100 / this.GetNormalScale() } _SetTransform(renderer, offX=0, offY=0) { const renderScale = this._runtime.GetRenderScale(); const camX = (this._viewport.midX() + offX) * renderScale; const camY = (this._viewport.midY() + offY) * renderScale; const camZ = this.GetCameraZ(); renderer.SetCameraXYZ(camX, camY, camZ); renderer.SetLookXYZ(camX, camY, camZ - 100); const a = this.GetAngle(); const upVector = tempVec3; if (a === 0) vec3.set(upVector, 0, 1, 0); else vec3.set(upVector, Math.sin(a), Math.cos(a), 0); renderer.ResetModelView(upVector); renderer.Scale(renderScale, renderScale); renderer.UpdateModelView() } Draw(renderer, destinationRenderTarget, isFirstDrawnLayer) { const canvasManager = this._runtime.GetCanvasManager(); const useOwnTexture = this.UsesOwnTexture(); let ownRenderTarget = null; let layerQuery = null; if (this._runtime.IsGPUProfiling() && renderer.SupportsGPUProfiling()) { const timingsBuffer = canvasManager.GetLayerTimingsBuffer(this); if (timingsBuffer) { layerQuery = timingsBuffer.AddTimeElapsedQuery(); renderer.StartQuery(layerQuery) } } if (useOwnTexture) { const rtOpts = { sampling: this._runtime.GetSampling() }; if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") { rtOpts.width = canvasManager.GetDrawWidth(); rtOpts.height = canvasManager.GetDrawHeight() } ownRenderTarget = this._runtime.GetAdditionalRenderTarget(rtOpts); renderer.SetRenderTarget(ownRenderTarget); if (this.IsTransparent()) renderer.ClearRgba(0, 0, 0, 0) } else renderer.SetRenderTarget(destinationRenderTarget); if (!this.IsTransparent()) renderer.Clear(this._backgroundColor); this._curRenderTarget = ownRenderTarget || destinationRenderTarget; this._SetTransform(renderer); renderer.SetBaseZ(this.GetZElevation()); if (this.GetNormalScale() > Number.EPSILON) { this._UpdateZIndices(); const useRenderCells = this._useRenderCells && this.GetZElevation() === 0 && !this._anyInstanceZElevated; if (useRenderCells) this._DrawInstances_RenderCells(renderer); else this._DrawInstances(renderer, this._instances) } renderer.SetBaseZ(0); renderer.SetCurrentZ(0); renderer.SetCameraXYZ(0, 0, 100); renderer.SetLookXYZ(0, 0, 0); if (useOwnTexture) this._DrawLayerOwnTextureToRenderTarget(renderer, ownRenderTarget, destinationRenderTarget, isFirstDrawnLayer); if (layerQuery) renderer.EndQuery(layerQuery); this._curRenderTarget = null } _DrawInstances(renderer, instances) { const viewport = this._viewport; const renderTarget = this._curRenderTarget; let lastInst = null; for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; if (inst === lastInst) continue; lastInst = inst; const wi = inst.GetWorldInfo(); if (wi.IsVisible() && wi.IsInViewport(viewport)) if (wi.HasAnyActiveEffect()) this._DrawInstanceWithEffectsAndRestore(inst, wi, renderer, renderTarget); else this._DrawInstance(inst, wi, renderer) } } _DrawInstances_RenderCells(renderer) { const renderGrid = this._renderGrid; const curRenderCells = this._curRenderCells; const lastRenderCells = this._lastRenderCells; const viewport = this._viewport; let instancesToDraw; curRenderCells.set(renderGrid.XToCell(viewport.getLeft()), renderGrid.YToCell(viewport.getTop()), renderGrid.XToCell(viewport.getRight()), renderGrid.YToCell(viewport.getBottom())); if (!this._isRenderListUpToDate || !curRenderCells.equals(lastRenderCells)) { instancesToDraw = this._GetRenderCellInstancesToDraw(); this._isRenderListUpToDate = true; lastRenderCells.copy(curRenderCells) } else instancesToDraw = this._lastRenderList; this._DrawInstances(renderer, instancesToDraw); if (instancesToDraw !== this._lastRenderList) C3.shallowAssignArray(this._lastRenderList, instancesToDraw) } _DrawInstance(inst, wi, renderer) { const wiStateGroup = wi.GetRendererStateGroup(); if (renderer.GetCurrentStateGroup() !== wiStateGroup) wiStateGroup.Apply(); inst.Draw(renderer) } _DrawInstanceWithEffectsAndRestore(inst, wi, renderer, renderTarget) { if (this._DrawInstanceWithEffects(inst, wi, renderer, renderTarget, null)) this._SetTransform(renderer) } _DrawInstanceWithEffects(inst, wi, renderer, renderTarget, opts) { const activeEffectTypes = wi.GetInstanceEffectList().GetActiveEffectTypes(); if (activeEffectTypes.length === 1) { const effectType = activeEffectTypes[0]; const shaderProgram = effectType.GetShaderProgram(); if (!shaderProgram.NeedsPostDrawOrExtendsBox() && wi.HasDefaultColor() && !inst.MustPreDraw()) { this._DrawInstanceWithEffects_FastPath(inst, wi, effectType, shaderProgram, renderer); return false } } const ret = C3.RenderEffectChain(renderer, this._runtime, inst, renderTarget, activeEffectTypes, opts); renderer.SetBaseZ(this.GetZElevation()); return ret } _DrawInstanceWithEffects_FastPath(inst, wi, effectType, shaderProgram, renderer) { renderer.SetProgram(shaderProgram); renderer.SetBlendMode(wi.GetBlendMode()); if (shaderProgram.IsAnimated()) this._runtime.UpdateRender(); let pixelWidth = 0 , pixelHeight = 0; if (shaderProgram.UsesAnySrcRectOrPixelSize()) { const [sheetWidth,sheetHeight] = inst.GetCurrentSurfaceSize(); pixelWidth = 1 / sheetWidth; pixelHeight = 1 / sheetHeight; const instTexRect = inst.GetCurrentTexRect(); if (instTexRect) tmpSrcRect.copy(instTexRect); else tmpSrcRect.set(0, 0, 0, 0) } const paramArr = wi.GetInstanceEffectList().GetEffectParametersForIndex(effectType.GetIndex()); renderer.SetCurrentZ(wi.GetZElevation()); renderer.SetProgramParameters(null, tmpDestRect, tmpSrcRect, tmpSrcRect, wi.GetBoundingBox(), pixelWidth, pixelHeight, this.GetOwnScale(), this.GetAngle(), this._runtime.GetGameTime(), paramArr); inst.Draw(renderer) } _DrawLayerOwnTextureToRenderTarget(renderer, ownRenderTarget, destinationRenderTarget, isFirstDrawnLayer) { const activeEffectTypes = this._effectList.GetActiveEffectTypes(); const runtime = this._runtime; if (this._CanFastPathDrawLayer(activeEffectTypes)) { renderer.SetRenderTarget(destinationRenderTarget); if (activeEffectTypes.length === 1) { const effectType = activeEffectTypes[0]; const shaderProgram = effectType.GetShaderProgram(); renderer.SetProgram(shaderProgram); tmpSrcRect.set(0, 0, 1, 1); const paramArr = this._effectList.GetEffectParametersForIndex(effectType.GetIndex()); renderer.SetProgramParameters(null, tmpDestRect, tmpSrcRect, tmpSrcRect, this._viewport, 1 / runtime.GetDrawWidth(), 1 / runtime.GetDrawHeight(), this.GetNormalScale(), this.GetAngle(), runtime.GetGameTime(), paramArr); if (shaderProgram.IsAnimated()) runtime.UpdateRender() } else renderer.SetTextureFillMode(); if (isFirstDrawnLayer && this._blendMode === 0 && this.HasDefaultColor() && activeEffectTypes.length === 0) renderer.CopyRenderTarget(ownRenderTarget); else { renderer.SetBlendMode(this._blendMode); renderer.SetColor(this._premultipliedColor); renderer.DrawRenderTarget(ownRenderTarget) } renderer.InvalidateRenderTarget(ownRenderTarget); runtime.ReleaseAdditionalRenderTarget(ownRenderTarget) } else C3.RenderEffectChain(renderer, runtime, this, destinationRenderTarget, activeEffectTypes) } GetOwnScale() { return this._scale } SetOwnScale(s) { if (this._scale === s) return; this._scale = s; this._layout.BoundScrolling(); this._runtime.UpdateRender() } GetRenderScale() { return this.GetNormalScale() * this._runtime.GetRenderScale() } GetDisplayScale() { return this.GetNormalScale() * this._runtime.GetDisplayScale() } GetNormalScale() { return (this._scale * this._layout.GetScale() - 1) * this._scaleRate + 1 } UpdateViewport() { this._isAngleEnabled = false; let[px,py] = this.CanvasCssToLayer(0, 0); this._isAngleEnabled = true; if (this._runtime.IsPixelRoundingEnabled()) { px = Math.round(px); py = Math.round(py) } const invScale = 1 / this.GetNormalScale(); const viewportZ0 = this._viewportZ0; viewportZ0.set(px, py, px + this._runtime.GetViewportWidth() * invScale, py + this._runtime.GetViewportHeight() * invScale); const myAngle = this.GetAngle(); if (myAngle !== 0) { tmpRect.copy(viewportZ0); tmpRect.offset(-viewportZ0.midX(), -viewportZ0.midY()); tmpQuad.setFromRotatedRect(tmpRect, myAngle); tmpQuad.getBoundingBox(tmpRect); tmpRect.offset(viewportZ0.midX(), viewportZ0.midY()); viewportZ0.copy(tmpRect) } this.GetViewportForZ(this._zElevation, this._viewport) } CanvasCssToLayer(ptx, pty, z=0) { return this._CanvasToLayer(ptx, pty, z, this.GetDisplayScale()) } DrawSurfaceToLayer(ptx, pty, z=0) { return this._CanvasToLayer(ptx, pty, z, this.GetRenderScale() * this.GetDevicePixelRatio()) } _CanvasToLayer(canvasX, canvasY, zElevation, displayScale) { const parallaxOriginX = this._runtime.GetParallaxXOrigin(); const parallaxOriginY = this._runtime.GetParallaxYOrigin(); const scrollOriginX = (this._layout.GetScrollX() - parallaxOriginX) * this._parallaxX + parallaxOriginX; const scrollOriginY = (this._layout.GetScrollY() - parallaxOriginY) * this._parallaxY + parallaxOriginY; const normalScale = this.GetNormalScale(); const scaledViewportWidth = this._runtime.GetViewportWidth() / normalScale; const scaledViewportHeight = this._runtime.GetViewportHeight() / normalScale; const viewportOriginX = scrollOriginX - scaledViewportWidth / 2; const viewportOriginY = scrollOriginY - scaledViewportHeight / 2; let layerX = viewportOriginX + canvasX / displayScale; let layerY = viewportOriginY + canvasY / displayScale; const a = this.GetAngle(); if (a !== 0) { layerX -= scrollOriginX; layerY -= scrollOriginY; const cosa = Math.cos(a); const sina = Math.sin(a); const x_temp = layerX * cosa - layerY * sina; layerY = layerY * cosa + layerX * sina; layerX = x_temp; layerX += scrollOriginX; layerY += scrollOriginY } if (zElevation !== 0) { const midX = this._viewportZ0.midX(); const midY = this._viewportZ0.midY(); const scaleFactor = this.Get2DScaleFactorToZ(zElevation); layerX = (layerX - midX) / scaleFactor + midX; layerY = (layerY - midY) / scaleFactor + midY } return [layerX, layerY] } CanvasCssToLayer_DefaultTransform(ptx, pty) { const scale = this._scale; const scaleRate = this._scaleRate; const parallaxX = this._parallaxX; const parallaxY = this._parallaxY; const angle = this._angle; this._scale = 1; this._scaleRate = 1; this._parallaxX = 1; this._parallaxY = 1; this._angle = 0; const ret = this.CanvasCssToLayer(ptx, pty); this._scale = scale; this._scaleRate = scaleRate; this._parallaxX = parallaxX; this._parallaxY = parallaxY; this._angle = angle; return ret } LayerToCanvasCss(ptx, pty, z=0) { return this._LayerToCanvas(ptx, pty, z, this.GetDisplayScale()) } LayerToDrawSurface(ptx, pty, z=0) { return this._LayerToCanvas(ptx, pty, z, this.GetRenderScale() * this.GetDevicePixelRatio()) } _LayerToCanvas(layerX, layerY, zElevation, displayScale) { const runtime = this._runtime; const layout = this._layout; if (zElevation !== 0) { const midX = this._viewportZ0.midX(); const midY = this._viewportZ0.midY(); const scaleFactor = this.Get2DScaleFactorToZ(zElevation); layerX = (layerX - midX) * scaleFactor + midX; layerY = (layerY - midY) * scaleFactor + midY } const parallaxOriginX = runtime.GetParallaxXOrigin(); const parallaxOriginY = runtime.GetParallaxYOrigin(); const scrollOriginX = (layout.GetScrollX() - parallaxOriginX) * this._parallaxX + parallaxOriginX; const scrollOriginY = (layout.GetScrollY() - parallaxOriginY) * this._parallaxY + parallaxOriginY; const a = this.GetAngle(); if (a !== 0) { layerX -= scrollOriginX; layerY -= scrollOriginY; const cosa = Math.cos(-a); const sina = Math.sin(-a); const x_temp = layerX * cosa - layerY * sina; layerY = layerY * cosa + layerX * sina; layerX = x_temp; layerX += scrollOriginX; layerY += scrollOriginY } const normalScale = this.GetNormalScale(); const scaledViewportWidth = runtime.GetViewportWidth() / normalScale; const scaledViewportHeight = runtime.GetViewportHeight() / normalScale; const viewportOriginX = scrollOriginX - scaledViewportWidth / 2; const viewportOriginY = scrollOriginY - scaledViewportHeight / 2; const viewportOffX = layerX - viewportOriginX; const viewportOffY = layerY - viewportOriginY; const canvasX = viewportOffX * displayScale; const canvasY = viewportOffY * displayScale; return [canvasX, canvasY] } _GetLayerToDrawSurfaceScale(size, zElevation) { size *= this.GetRenderScale() * this.GetDevicePixelRatio(); if (zElevation !== 0) size *= this.Get2DScaleFactorToZ(zElevation); return size } _SaveToJson() { const o = { "s": this.GetOwnScale(), "a": this.GetOwnAngle(), "vl": this._viewport.getLeft(), "vt": this._viewport.getTop(), "vr": this._viewport.getRight(), "vb": this._viewport.getBottom(), "v": this.IsVisible(), "bc": this._backgroundColor.toJSON(), "t": this.IsTransparent(), "px": this.GetParallaxX(), "py": this.GetParallaxY(), "c": this._color.toJSON(), "sr": this.GetScaleRate(), "fx": this._effectList.SaveToJson(), "cg": this._createdGlobalUids }; return o } _LoadFromJson(o) { this._scale = o["s"]; this._angle = o["a"]; this._viewport.set(o["vl"], o["vt"], o["vr"], o["vb"]); this._isVisible = !!o["v"]; this._backgroundColor.setFromJSON(o["bc"]); this._isTransparent = !!o["t"]; this._parallaxX = o["px"]; this._parallaxY = o["py"]; this._color.setFromJSON(o["c"]); this._scaleRate = o["sr"]; C3.shallowAssignArray(this._createdGlobalUids, o["cg"]); C3.shallowAssignArray(this._initialInstances, this._startupInitialInstances); const tempSet = new Set(this._createdGlobalUids); let j = 0; for (let i = 0, len = this._initialInstances.length; i < len; ++i) if (!tempSet.has(this._initialInstances[i][2])) { this._initialInstances[j] = this._initialInstances[i]; ++j } C3.truncateArray(this._initialInstances, j); this._effectList.LoadFromJson(o["fx"]); this._SortInstancesByLastCachedZIndex(false); this.SetZIndicesChanged() } GetILayer() { return this._iLayer } } } ;'use strict'; { const C3 = self.C3; const C3Debugger = self.C3Debugger; const assert = self.assert; const tempDestRect = C3.New(C3.Rect); const tempSrcRect = C3.New(C3.Rect); const tempLayoutRect = C3.New(C3.Rect); C3.Layout = class Layout extends C3.DefendedBase { constructor(layoutManager, index, data) { super(); this._layoutManager = layoutManager; this._runtime = layoutManager.GetRuntime(); this._name = data[0]; this._originalWidth = data[1]; this._originalHeight = data[2]; this._width = data[1]; this._height = data[2]; this._isUnboundedScrolling = !!data[3]; this._eventSheetName = data[4]; this._eventSheet = null; this._sid = data[5]; this._index = index; this._scrollX = 0; this._scrollY = 0; this._scale = 1; this._angle = 0; this._initialObjectClasses = new Set; this._textureLoadedTypes = new Set; this._textureLoadPendingPromises = new Set; this._createdInstances = []; this._initialNonWorld = []; this._layers = []; this._layersByName = new Map; this._layersBySid = new Map; this._effectList = C3.New(C3.EffectList, this, data[8]); this._curRenderTarget = null; this._persistData = {}; this._isFirstVisit = true; this._iLayout = new self.ILayout(this); this._userScriptDispatcher = C3.New(C3.Event.Dispatcher); for (const layerData of data[6]) { const layer = C3.Layer.Create(this, this._layers.length, layerData); this._layers.push(layer); this._layersByName.set(layer.GetName().toLowerCase(), layer); this._layersBySid.set(layer.GetSID(), layer) } for (const instData of data[7]) { const objectClass = this._runtime.GetObjectClassByIndex(instData[1]); if (!objectClass) throw new Error("missing nonworld object class"); if (!objectClass.GetDefaultInstanceData()) objectClass.SetDefaultInstanceData(instData); this._initialNonWorld.push(instData); this._AddInitialObjectClass(objectClass) } } Release() { for (const l of this._layers) l.Release(); C3.clearArray(this._layers); this._textureLoadPendingPromises.clear(); this._eventSheet = null; this._layoutManager = null; this._runtime = null } GetRuntime() { return this._runtime } GetName() { return this._name } GetSID() { return this._sid } GetIndex() { return this._index } GetEffectList() { return this._effectList } GetMinLayerScale() { let m = this._layers[0].GetNormalScale(); for (let i = 1, len = this._layers.length; i < len; ++i) { const layer = this._layers[i]; if (layer.GetParallaxX() === 0 && layer.GetParallaxY() === 0) continue; m = Math.min(m, layer.GetNormalScale()) } return m } SetScrollX(x) { if (!this._isUnboundedScrolling) { const widthBoundary = this._runtime.GetViewportWidth() * (1 / this.GetMinLayerScale()) / 2; if (x > this._width - widthBoundary) x = this._width - widthBoundary; if (x < widthBoundary) x = widthBoundary } if (this._scrollX !== x) { this._scrollX = x; this._runtime.UpdateRender() } } GetScrollX() { return this._scrollX } SetScrollY(y) { if (!this._isUnboundedScrolling) { const heightBoundary = this._runtime.GetViewportHeight() * (1 / this.GetMinLayerScale()) / 2; if (y > this._height - heightBoundary) y = this._height - heightBoundary; if (y < heightBoundary) y = heightBoundary } if (this._scrollY !== y) { this._scrollY = y; this._runtime.UpdateRender() } } GetScrollY() { return this._scrollY } BoundScrolling() { this.SetScrollX(this.GetScrollX()); this.SetScrollY(this.GetScrollY()) } GetScale() { return this._scale } SetScale(s) { s = +s; if (this._scale === s) return; this._scale = s; this.BoundScrolling() } SetAngle(a) { this._angle = C3.clampAngle(a) } GetAngle() { return this._angle } GetWidth() { return this._width } SetWidth(w) { if (!isFinite(w) || w < 1) return; this._width = w } GetHeight() { return this._height } SetHeight(h) { if (!isFinite(h) || h < 1) return; this._height = h } GetEventSheet() { return this._eventSheet } GetLayers() { return this._layers } GetLayerCount() { return this._layers.length } GetLayer(p) { if (typeof p === "number") return this.GetLayerByIndex(p); else return this.GetLayerByName(p.toString()) } GetLayerByIndex(i) { i = C3.clamp(Math.floor(i), 0, this._layers.length - 1); return this._layers[i] } GetLayerByName(name) { return this._layersByName.get(name.toLowerCase()) || null } GetLayerBySID(sid) { return this._layersBySid.get(sid) || null } HasOpaqueBottomLayer() { for (const layer of this._layers) if (layer.ShouldDraw()) return layer._IsOpaque(); return false } IsFirstVisit() { return this._isFirstVisit } _GetInitialObjectClasses() { return [...this._initialObjectClasses] } _AddInitialObjectClass(objectClass) { if (objectClass.IsInContainer()) for (const containerType of objectClass.GetContainer().GetObjectTypes()) this._initialObjectClasses.add(containerType); else this._initialObjectClasses.add(objectClass) } _GetTextureLoadedObjectTypes() { return [...this._textureLoadedTypes] } _Load(previousLayout, renderer) { if (previousLayout === this || !renderer) return Promise.resolve(); if (previousLayout) { C3.CopySet(this._textureLoadedTypes, previousLayout._textureLoadedTypes); previousLayout._textureLoadedTypes.clear() } const promises = []; for (const oc of this._initialObjectClasses) if (!this._textureLoadedTypes.has(oc)) { promises.push(oc.LoadTextures(renderer)); this._textureLoadedTypes.add(oc) } return Promise.all(promises) } async MaybeLoadTexturesFor(objectClass) { if (objectClass.IsFamily()) throw new Error("cannot load textures for family"); const renderer = this._runtime.GetWebGLRenderer(); if (!renderer || renderer.IsContextLost() || this._textureLoadedTypes.has(objectClass)) return; this._textureLoadedTypes.add(objectClass); const loadPromise = objectClass.LoadTextures(renderer); this._AddPendingTextureLoadPromise(loadPromise); await loadPromise; objectClass.OnDynamicTextureLoadComplete(); this._runtime.UpdateRender() } _AddPendingTextureLoadPromise(promise) { this._textureLoadPendingPromises.add(promise); promise.then(()=>this._textureLoadPendingPromises.delete(promise)).catch(()=>this._textureLoadPendingPromises.delete(promise)) } WaitForPendingTextureLoadsToComplete() { return Promise.all([...this._textureLoadPendingPromises]) } MaybeUnloadTexturesFor(objectClass) { if (objectClass.IsFamily() || objectClass.GetInstanceCount() > 0) throw new Error("cannot unload textures"); const renderer = this._runtime.GetWebGLRenderer(); if (!renderer || !this._textureLoadedTypes.has(objectClass)) return; this._textureLoadedTypes.delete(objectClass); objectClass.ReleaseTextures(renderer) } _Unload(nextLayout, renderer) { if (nextLayout === this || !renderer) return; for (const oc of this._textureLoadedTypes) if (!oc.IsGlobal() && !nextLayout._initialObjectClasses.has(oc)) { oc.ReleaseTextures(); this._textureLoadedTypes.delete(oc) } } _OnWebGLContextLost() { this._textureLoadedTypes.clear() } async _StartRunning(isFirstLayout) { const runtime = this._runtime; const layoutManager = this._layoutManager; const eventSheetManager = runtime.GetEventSheetManager(); if (this._eventSheetName) { this._eventSheet = eventSheetManager.GetEventSheetByName(this._eventSheetName); this._eventSheet._UpdateDeepIncludes() } layoutManager._SetMainRunningLayout(this); this._width = this._originalWidth; this._height = this._originalHeight; this._scrollX = runtime.GetOriginalViewportWidth() / 2; this._scrollY = runtime.GetOriginalViewportHeight() / 2; this.BoundScrolling(); this._MoveGlobalObjectsToThisLayout(isFirstLayout); this._runtime.SetUsingCreatePromises(true); this._CreateInitialInstances(); if (!this._isFirstVisit) this._CreatePersistedInstances(); this._CreateAndLinkContainerInstances(this._createdInstances); this._CreateInitialNonWorldInstances(); layoutManager.ClearPendingChangeLayout(); runtime.FlushPendingInstances(); this._runtime.SetUsingCreatePromises(false); const createPromises = this._runtime.GetCreatePromises(); await Promise.all(createPromises); C3.clearArray(createPromises); if (runtime.IsLoadingState()) runtime._TriggerOnCreateAfterLoad(this._createdInstances); else for (const inst of this._createdInstances) { inst._TriggerOnCreated(); inst.SetupInitialSceneGraphConnections() } C3.clearArray(this._createdInstances); await Promise.all([...this._initialObjectClasses].map(oc=>oc.PreloadTexturesWithInstances(this._runtime.GetWebGLRenderer()))); if (isFirstLayout) { runtime.Dispatcher().dispatchEvent(new C3.Event("beforefirstlayoutstart")); await runtime.DispatchUserScriptEventAsyncWait(new C3.Event("beforeprojectstart")) } await this.DispatchUserScriptEventAsyncWait(new C3.Event("beforelayoutstart")); if (!runtime.IsLoadingState()) await runtime.TriggerAsync(C3.Plugins.System.Cnds.OnLayoutStart, null, null); await this.DispatchUserScriptEventAsyncWait(new C3.Event("afterlayoutstart")); if (isFirstLayout) { runtime.Dispatcher().dispatchEvent(new C3.Event("afterfirstlayoutstart")); await runtime.DispatchUserScriptEventAsyncWait(new C3.Event("afterprojectstart")) } eventSheetManager._RunQueuedTriggers(layoutManager); await this.WaitForPendingTextureLoadsToComplete(); this._isFirstVisit = false } _MoveGlobalObjectsToThisLayout(isFirstLayout) { for (const objectClass of this._runtime.GetAllObjectClasses()) { if (objectClass.IsFamily() || !objectClass.IsWorldType()) continue; for (const inst of objectClass.GetInstances()) { const wi = inst.GetWorldInfo(); const oldLayer = wi.GetLayer(); const layerIndex = C3.clamp(oldLayer.GetIndex(), 0, this._layers.length - 1); const newLayer = this._layers[layerIndex]; wi._SetLayer(newLayer); newLayer._MaybeAddInstance(inst) } } if (!isFirstLayout) for (const layer of this._layers) layer._SortInstancesByLastCachedZIndex(false) } _CreateInitialInstances() { for (const layer of this._layers) { layer.CreateInitialInstances(this._createdInstances); layer.UpdateViewport(); layer._Start() } } _CreatePersistedInstances() { let uidsChanged = false; for (const [sidStr,typeData] of Object.entries(this._persistData)) { const objectClass = this._runtime.GetObjectClassBySID(parseInt(sidStr, 10)); if (!objectClass || objectClass.IsFamily() || !objectClass.HasPersistBehavior()) continue; for (const instData of typeData) { let layer = null; if (objectClass.IsWorldType()) { layer = this.GetLayerBySID(instData["w"]["l"]); if (!layer) continue } const inst = this._runtime.CreateInstanceFromData(objectClass, layer, false, 0, 0, true); inst.LoadFromJson(instData); uidsChanged = true; this._createdInstances.push(inst) } C3.clearArray(typeData) } for (const layer of this._layers) { layer._SortInstancesByLastCachedZIndex(true); layer.SetZIndicesChanged() } if (uidsChanged) { this._runtime.FlushPendingInstances(); this._runtime._RefreshUidMap() } } _CreateAndLinkContainerInstances(createdInstances) { for (const inst of createdInstances) { if (!inst.IsInContainer()) continue; const wi = inst.GetWorldInfo(); const iid = inst.GetIID(); for (const containerType of inst.GetObjectClass().GetContainer().objectTypes()) { if (containerType === inst.GetObjectClass()) continue; const instances = containerType.GetInstances(); if (instances.length > iid) inst._AddSibling(instances[iid]); else { let s; if (wi) s = this._runtime.CreateInstanceFromData(containerType, wi.GetLayer(), true, wi.GetX(), wi.GetY(), true); else s = this._runtime.CreateInstanceFromData(containerType, null, true, 0, 0, true); this._runtime.FlushPendingInstances(); containerType._UpdateIIDs(); inst._AddSibling(s); createdInstances.push(s) } } } } _CreateInitialNonWorldInstances() { for (const instData of this._initialNonWorld) { const objectClass = this._runtime.GetObjectClassByIndex(instData[1]); if (!objectClass.IsInContainer()) this._runtime.CreateInstanceFromData(instData, null, true) } } _CreateGlobalNonWorlds() { const createdInstances = []; const initialNonWorld = this._initialNonWorld; let k = 0; for (let i = 0, len = initialNonWorld.length; i < len; ++i) { const instData = initialNonWorld[i]; const objectClass = this._runtime.GetObjectClassByIndex(instData[1]); if (objectClass.IsGlobal()) { if (!objectClass.IsInContainer() || !objectClass.GetContainer().HasAnyWorldType()) createdInstances.push(this._runtime.CreateInstanceFromData(instData, null, true)) } else { initialNonWorld[k] = instData; ++k } } C3.truncateArray(initialNonWorld, k); this._runtime.FlushPendingInstances(); this._CreateAndLinkContainerInstances(createdInstances) } RecreateInitialObjects(objectClass, rc, srcLayer, offsetX, offsetY) { if (srcLayer) return srcLayer.RecreateInitialObjects(objectClass, rc, offsetX, offsetY); else { const ret = []; for (const layer of this._layers) ret.push(layer.RecreateInitialObjects(objectClass, rc, offsetX, offsetY)); return ret.flat() } } async _StopRunning() { const layoutManager = this._layoutManager; if (!this._runtime.IsLoadingState()) await this._runtime.TriggerAsync(C3.Plugins.System.Cnds.OnLayoutEnd, null, null); layoutManager.SetIsEndingLayout(true); this._runtime.GetEventSheetManager().ClearAllScheduledWaits(); if (!this._isFirstVisit) this._SavePersistData(); for (const layer of this._layers) layer._End(); for (const objectClass of this._runtime.GetAllObjectClasses()) { if (objectClass.IsGlobal() || objectClass.IsWorldType() || objectClass.GetPlugin().IsSingleGlobal() || objectClass.IsFamily()) continue; for (const inst of objectClass.GetInstances()) this._runtime.DestroyInstance(inst); this._runtime.FlushPendingInstances() } layoutManager.SetIsEndingLayout(false); if (layoutManager.GetMainRunningLayout() === this) layoutManager._SetMainRunningLayout(null) } _SaveInstanceToPersist(inst) { const sidStr = inst.GetObjectClass().GetSID().toString(); if (!this._persistData.hasOwnProperty(sidStr)) this._persistData[sidStr] = []; const typePersist = this._persistData[sidStr]; typePersist.push(inst.SaveToJson()) } _SavePersistData() { for (const layer of this._layers) { layer._UpdateZIndices(); for (const inst of layer._GetInstances()) { const objectClass = inst.GetObjectClass(); if (!objectClass.IsGlobal() && objectClass.HasPersistBehavior()) this._SaveInstanceToPersist(inst) } } } ResetPersistData() { this._persistData = {}; this._isFirstVisit = true } GetRenderTarget() { return this._curRenderTarget } UsesOwnTexture() { return this._runtime.GetCanvasManager().GetCurrentFullscreenScalingQuality() === "low" || this._runtime.UsesAnyBackgroundBlending() || this._runtime.GetCompositingMode() === "low-latency" || this._effectList.HasAnyActiveEffect() } _CanFastPathDrawLayout(activeEffectTypes) { if (activeEffectTypes.length === 0) return true; if (activeEffectTypes.length >= 2) return false; const effectType = activeEffectTypes[0]; const shaderProgram = effectType.GetShaderProgram(); return !shaderProgram.MustPreDraw() } Draw(renderer) { const canvasManager = this._runtime.GetCanvasManager(); const useOwnTexture = this.UsesOwnTexture(); let ownRenderTarget = null; if (useOwnTexture) { if (this._runtime.GetCompositingMode() !== "low-latency") { renderer.SetRenderTarget(null); renderer.ClearRgba(0, 0, 0, 0) } const rtOpts = { sampling: this._runtime.GetSampling(), readback: this._runtime.UsesAnyBackgroundBlending() || this._effectList.HasAnyActiveEffect() }; if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") { rtOpts.width = canvasManager.GetDrawWidth(); rtOpts.height = canvasManager.GetDrawHeight() } ownRenderTarget = this._runtime.GetAdditionalRenderTarget(rtOpts); renderer.SetRenderTarget(ownRenderTarget) } else renderer.SetRenderTarget(null); if (!this.HasOpaqueBottomLayer()) renderer.ClearRgba(0, 0, 0, 0); this._curRenderTarget = ownRenderTarget; let isFirstDrawnLayer = true; for (const layer of this._layers) { layer.UpdateViewport(); if (layer.ShouldDraw()) { layer.Draw(renderer, ownRenderTarget, isFirstDrawnLayer); isFirstDrawnLayer = false } } if (useOwnTexture) this._DrawLayoutOwnTextureToRenderTarget(renderer, ownRenderTarget); this._curRenderTarget = null } _DrawLayoutOwnTextureToRenderTarget(renderer, ownRenderTarget) { const activeEffectTypes = this._effectList.GetActiveEffectTypes(); const runtime = this._runtime; if (this._CanFastPathDrawLayout(activeEffectTypes)) { renderer.SetRenderTarget(null); if (activeEffectTypes.length === 1) { const effectType = activeEffectTypes[0]; const shaderProgram = effectType.GetShaderProgram(); renderer.SetProgram(shaderProgram); tempSrcRect.set(0, 0, 1, 1); tempLayoutRect.set(0, 0, runtime.GetViewportWidth(), runtime.GetViewportHeight()); const paramArr = this._effectList.GetEffectParametersForIndex(effectType.GetIndex()); renderer.SetProgramParameters(null, tempDestRect, tempSrcRect, tempSrcRect, tempLayoutRect, 1 / runtime.GetDrawWidth(), 1 / runtime.GetDrawHeight(), this.GetScale(), this.GetAngle(), runtime.GetGameTime(), paramArr); if (shaderProgram.IsAnimated()) runtime.UpdateRender() } else renderer.SetTextureFillMode(); if (activeEffectTypes.length === 0) renderer.CopyRenderTarget(ownRenderTarget); else { renderer.SetAlphaBlend(); renderer.ResetColor(); renderer.DrawRenderTarget(ownRenderTarget) } renderer.InvalidateRenderTarget(ownRenderTarget); runtime.ReleaseAdditionalRenderTarget(ownRenderTarget) } else C3.RenderEffectChain(renderer, runtime, this, null, activeEffectTypes) } _SaveToJson() { const o = { "sx": this.GetScrollX(), "sy": this.GetScrollY(), "s": this.GetScale(), "a": this.GetAngle(), "w": this.GetWidth(), "h": this.GetHeight(), "fv": this._isFirstVisit, "persist": this._persistData, "fx": this._effectList.SaveToJson(), "layers": {} }; for (const layer of this._layers) o["layers"][layer.GetSID().toString()] = layer._SaveToJson(); return o } _LoadFromJson(o) { this._scrollX = o["sx"]; this._scrollY = o["sy"]; this._scale = o["s"]; this._angle = o["a"]; this._width = o["w"]; this._height = o["h"]; this._isFirstVisit = !!o["fv"]; this._persistData = o["persist"]; this._effectList.LoadFromJson(o["fx"]); for (const [sidStr,data] of Object.entries(o["layers"])) { const sid = parseInt(sidStr, 10); const layer = this.GetLayerBySID(sid); if (!layer) continue; layer._LoadFromJson(data) } } GetILayout() { return this._iLayout } UserScriptDispatcher() { return this._userScriptDispatcher } DispatchUserScriptEvent(e) { e.layout = this.GetILayout(); const runtime = this._runtime; const shouldTime = runtime.IsDebug() && !runtime.GetEventSheetManager().IsInEventEngine(); if (shouldTime) C3Debugger.StartMeasuringScriptTime(); this._userScriptDispatcher.dispatchEvent(e); if (shouldTime) C3Debugger.AddScriptTime() } DispatchUserScriptEventAsyncWait(e) { e.layout = this.GetILayout(); return this._userScriptDispatcher.dispatchEventAndWaitAsync(e) } } } ;'use strict'; { const C3 = self.C3; C3.LayoutManager = class LayoutManager extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._allLayouts = []; this._layoutsByName = new Map; this._layoutsBySid = new Map; this._mainRunningLayout = null; this._runningSubLayouts = []; this._firstLayout = null; this._isEndingLayout = 0; this._pendingChangeLayout = null } Release() { this._runtime = null; this._mainRunningLayout = null; this._firstLayout = null; this._pendingChangeLayout = null; C3.clearArray(this._allLayouts); this._layoutsByName.clear(); this._layoutsBySid.clear(); C3.clearArray(this._runningSubLayouts) } Create(layoutData) { const layout = C3.New(C3.Layout, this, this._allLayouts.length, layoutData); this._allLayouts.push(layout); this._layoutsByName.set(layout.GetName().toLowerCase(), layout); this._layoutsBySid.set(layout.GetSID(), layout) } GetRuntime() { return this._runtime } SetFirstLayout(layout) { this._firstLayout = layout } GetFirstLayout() { if (this._firstLayout) return this._firstLayout; if (this._allLayouts.length) return this._allLayouts[0]; throw new Error("no first layout"); } GetLayoutByName(name) { return this._layoutsByName.get(name.toLowerCase()) || null } GetLayoutBySID(sid) { return this._layoutsBySid.get(sid) || null } GetLayoutByIndex(index) { index = C3.clamp(Math.floor(index), 0, this._allLayouts.length - 1); return this._allLayouts[index] } GetLayout(p) { if (typeof p === "number") return this.GetLayoutByIndex(p); else return this.GetLayoutByName(p.toString()) } GetAllLayouts() { return this._allLayouts } _SetMainRunningLayout(layout) { this._mainRunningLayout = layout } GetMainRunningLayout() { return this._mainRunningLayout } _AddRunningSubLayout(layout) { if (this._runningSubLayouts.includes(layout)) throw new Error("layout already running"); this._runningSubLayouts.push(layout) } _RemoveRunningSubLayout(layout) { const i = this._runningSubLayouts.indexOf(layout); if (i === -1) throw new Error("layout not running"); this._runningSubLayouts.splice(i, 1) } *runningLayouts() { if (this._mainRunningLayout) yield this._mainRunningLayout; if (this._runningSubLayouts.length) yield*this._runningSubLayouts } IsLayoutRunning(layout) { return this._mainRunningLayout === layout || this._runningSubLayouts.includes(layout) } SetIsEndingLayout(e) { if (e) this._isEndingLayout++; else { if (this._isEndingLayout <= 0) throw new Error("already unset"); this._isEndingLayout-- } } IsEndingLayout() { return this._isEndingLayout > 0 } ChangeMainLayout(layout) { this._pendingChangeLayout = layout } ClearPendingChangeLayout() { this._pendingChangeLayout = null } IsPendingChangeMainLayout() { return !!this._pendingChangeLayout } GetPendingChangeMainLayout() { return this._pendingChangeLayout } } } ;'use strict'; { const C3 = self.C3; class RenderEffectChainState { constructor() { this.renderer = null; this.runtime = null; this.drawWidth = 0; this.drawHeight = 0; this.surfaceWidth = 0; this.surfaceHeight = 0; this.layoutRect = new C3.Rect; this.rcTexBounce = new C3.Rect; this.rcTexDest = new C3.Rect; this.rcTexOrigin = new C3.Rect; this.screenRect = new C3.Rect; this.clearRect = new C3.Rect; this.srcRect = new C3.Rect; this.fxTex = [null, null]; this.fxIndex = 0; this.otherFxIndex = 1; this.boxExtendHorizontal = 0; this.boxExtendVertical = 0; this.layerScale = 0; this.layerAngle = 0; this.layout = null; this.layer = null; this.inst = null; this.wi = null; this.renderTarget = null; this.preDraw = false; this.postDraw = false; this.didChangeTransform = false; this.opts = null } Clear() { this.renderer = null; this.runtime = null; this.layout = null; this.layer = null; this.inst = null; this.wi = null; this.renderTarget = null; this.opts = null } ShouldPreDraw(firstEffectType) { const shaderProgram = firstEffectType.GetShaderProgram(); if (shaderProgram.MustPreDraw()) return true; if (this.inst) return shaderProgram.UsesDest() && (this.wi.GetAngle() !== 0 || this.wi.GetWidth() < 0 || this.wi.GetHeight() < 0) || this.boxExtendHorizontal !== 0 || this.boxExtendVertical !== 0 || !this.wi.HasDefaultColor() || this.inst.MustPreDraw(); else if (this.layer) return !this.layer.HasDefaultColor() } ShouldPostDraw(lastEffectType) { const shaderProgram = lastEffectType.GetShaderProgram(); return shaderProgram.UsesDest() || shaderProgram.UsesCrossSampling() || this.layout && this.runtime.GetCanvasManager().GetCurrentFullscreenScalingQuality() === "low" } GetEffectRenderTarget(i) { if (i !== 0 && i !== 1) throw new Error("invalid effect target"); const fxTex = this.fxTex; if (!fxTex[i]) { const runtime = this.runtime; const canvasManager = runtime.GetCanvasManager(); const opts = { sampling: runtime.GetSampling() }; if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") { opts.width = canvasManager.GetDrawWidth(); opts.height = canvasManager.GetDrawHeight() } fxTex[i] = canvasManager.GetAdditionalRenderTarget(opts) } return fxTex[i] } ReleaseEffectRenderTargets() { const fxTex = this.fxTex; const canvasManager = this.runtime.GetCanvasManager(); if (fxTex[0]) { canvasManager.ReleaseAdditionalRenderTarget(fxTex[0]); fxTex[0] = null } if (fxTex[1]) { canvasManager.ReleaseAdditionalRenderTarget(fxTex[1]); fxTex[1] = null } } } const ctxStack = []; let ctxPtr = 0; function AllocRenderEffectChainState() { if (ctxPtr === ctxStack.length) ctxStack.push(new RenderEffectChainState); return ctxStack[ctxPtr++] } function ReleaseRenderEffectChainState(ctx) { ctx.ReleaseEffectRenderTargets(); ctx.Clear(); ctxPtr-- } const tempQuad = new C3.Quad; let isDebug = false; let isDebugFrame = false; async function DebugLogRenderTargetContents(msg, renderer, renderTarget) { const blob = await C3.Gfx.WebGLRenderTarget.DebugReadPixelsToBlob(renderer, renderTarget); const blobUrl = URL.createObjectURL(blob); console.log("[FX] " + msg + " " + (renderTarget ? "" : " [to display]") + ": ", blobUrl) } C3.RenderEffectChain = function RenderEffectChain(renderer, runtime, effectsObject, renderTarget_, activeEffectTypes, opts_) { const ctx = AllocRenderEffectChainState(); ctx.renderer = renderer; ctx.runtime = runtime; if (effectsObject instanceof C3.Instance) { ctx.inst = effectsObject; ctx.wi = ctx.inst.GetWorldInfo() } else if (effectsObject instanceof C3.Layer) ctx.layer = effectsObject; else if (effectsObject instanceof C3.Layout) ctx.layout = effectsObject; else throw new Error("invalid effects object"); const canvasManager = runtime.GetCanvasManager(); ctx.renderTarget = renderTarget_; ctx.drawWidth = canvasManager.GetDrawWidth(); ctx.drawHeight = canvasManager.GetDrawHeight(); ctx.surfaceWidth = ctx.drawWidth; ctx.surfaceHeight = ctx.drawHeight; ctx.fxIndex = 0; ctx.otherFxIndex = 1; ctx.boxExtendHorizontal = 0; ctx.boxExtendVertical = 0; ctx.screenRect.set(0, 0, ctx.drawWidth, ctx.drawHeight); ctx.clearRect.set(0, 0, ctx.drawWidth, ctx.drawHeight); ctx.didChangeTransform = false; ctx.opts = opts_; if (ctx.inst) { const wi = ctx.wi; ctx.layerScale = wi.GetLayer().GetRenderScale(); ctx.layerAngle = wi.GetLayer().GetAngle(); ctx.layoutRect.copy(wi.GetBoundingBox()) } else if (ctx.layer) { const layer = ctx.layer; ctx.layerScale = layer.GetRenderScale(); ctx.layerAngle = layer.GetAngle(); ctx.layoutRect.copy(layer.GetViewport()) } else { const layout = ctx.layout; ctx.layerScale = layout.GetScale(); ctx.layerAngle = layout.GetAngle(); ctx.layoutRect.set(0, 0, ctx.drawWidth, ctx.drawHeight) } if (ctx.inst) GetInstanceBox(ctx, activeEffectTypes); else { ctx.rcTexBounce.set(0, 0, ctx.drawWidth / ctx.surfaceWidth, ctx.drawHeight / ctx.surfaceHeight); ctx.rcTexDest.copy(ctx.rcTexBounce); ctx.rcTexOrigin.copy(ctx.rcTexBounce); ctx.rcTexBounce.swapTopBottom(); ctx.rcTexDest.swapTopBottom(); ctx.rcTexOrigin.swapTopBottom() } renderer.SetAlphaBlend(); renderer.ResetColor(); renderer.SetBaseZ(0); renderer.SetCurrentZ(0); ctx.preDraw = ctx.ShouldPreDraw(activeEffectTypes[0]); if (ctx.preDraw) PreDraw(ctx); renderer.ResetColor(); const lastEffectTypeIndex = activeEffectTypes.length - 1; ctx.postDraw = ctx.ShouldPostDraw(activeEffectTypes[lastEffectTypeIndex]); for (let i = 0, len = activeEffectTypes.length; i < len; ++i) { const effectType = activeEffectTypes[i]; const shaderProgram = effectType.GetShaderProgram(); renderer.SetProgram(shaderProgram); if (shaderProgram.IsAnimated()) runtime.UpdateRender(); if (i === 0 && !ctx.preDraw) RenderFirstBounce(ctx, effectType); else { renderer.SetCopyBlend(); const isLast = i === lastEffectTypeIndex && !ctx.postDraw; RenderBounce(ctx, effectType, isLast, i) } if (ctx.fxIndex === 0) { ctx.fxIndex = 1; ctx.otherFxIndex = 0 } else { ctx.fxIndex = 0; ctx.otherFxIndex = 1 } } if (ctx.postDraw) PostDraw(ctx, activeEffectTypes); const ret = ctx.didChangeTransform; ReleaseRenderEffectChainState(ctx); isDebugFrame = false; return ret } ; function GetInstanceBox(ctx, activeEffectTypes) { for (let i = 0, len = activeEffectTypes.length; i < len; ++i) { const shaderProgram = activeEffectTypes[i].GetShaderProgram(); ctx.boxExtendHorizontal += shaderProgram.GetBoxExtendHorizontal(); ctx.boxExtendVertical += shaderProgram.GetBoxExtendVertical() } const wi = ctx.wi; const layer = wi.GetLayer(); const layerAngle = layer.GetAngle(); const bbox = wi.GetBoundingBox(); const z = wi.GetTotalZElevation(); let[sl,st] = layer.LayerToDrawSurface(bbox.getLeft(), bbox.getTop(), z); let[sr,sb] = layer.LayerToDrawSurface(bbox.getRight(), bbox.getBottom(), z); if (layerAngle !== 0) { const [strx,stry] = layer.LayerToDrawSurface(bbox.getRight(), bbox.getTop(), z); const [sblx,sbly] = layer.LayerToDrawSurface(bbox.getLeft(), bbox.getBottom(), z); let temp = Math.min(sl, sr, strx, sblx); sr = Math.max(sl, sr, strx, sblx); sl = temp; temp = Math.min(st, sb, stry, sbly); sb = Math.max(st, sb, stry, sbly); st = temp } const screenRect = ctx.screenRect; const rcTexOrigin = ctx.rcTexOrigin; const rcTexDest = ctx.rcTexDest; const clearRect = ctx.clearRect; const rcTexBounce = ctx.rcTexBounce; screenRect.set(sl, st, sr, sb); screenRect.shuntY(ctx.drawHeight); rcTexOrigin.copy(screenRect); rcTexOrigin.divide(ctx.surfaceWidth, ctx.surfaceHeight); rcTexOrigin.swapTopBottom(); screenRect.inflate(ctx.boxExtendHorizontal, ctx.boxExtendVertical); rcTexDest.copy(screenRect); rcTexDest.divide(ctx.surfaceWidth, ctx.surfaceHeight); rcTexDest.swapTopBottom(); clearRect.copy(screenRect); clearRect.roundOuter(); clearRect.inflate(ctx.boxExtendHorizontal + 1, ctx.boxExtendVertical + 1); screenRect.clamp(0, 0, ctx.drawWidth, ctx.drawHeight); clearRect.clamp(0, 0, ctx.drawWidth, ctx.drawHeight); rcTexBounce.copy(screenRect); rcTexBounce.divide(ctx.surfaceWidth, ctx.surfaceHeight); rcTexBounce.swapTopBottom() } function PreDraw(ctx) { const renderer = ctx.renderer; renderer.SetTextureFillMode(); const fxTarget = ctx.GetEffectRenderTarget(ctx.fxIndex); renderer.SetRenderTarget(fxTarget); const opts = ctx.opts; if (opts && opts.preTransform) opts.preTransform(); if (isDebug) renderer.ClearRgba(1, 0, 0, 1); renderer.ClearRect2(ctx.clearRect); if (ctx.inst) { renderer.SetColor(ctx.wi.GetPremultipliedColor()); renderer.SetCurrentZ(ctx.wi.GetTotalZElevation()); ctx.inst.Draw(renderer); renderer.SetCurrentZ(0) } else { const renderSurface = (ctx.layer || ctx.layout).GetRenderTarget(); if (ctx.layer) renderer.SetColor(ctx.layer.GetPremultipliedColor()); else renderer.ResetColor(); renderer.DrawRenderTarget(renderSurface); renderer.InvalidateRenderTarget(renderSurface); ctx.runtime.GetCanvasManager().ReleaseAdditionalRenderTarget(renderSurface) } ctx.rcTexDest.clampFlipped(0, 1, 1, 0); ctx.fxIndex = 1; ctx.otherFxIndex = 0; if (isDebugFrame) DebugLogRenderTargetContents("Pre-draw", renderer, fxTarget) } function RenderFirstBounce(ctx, effectType) { const renderer = ctx.renderer; const runtime = ctx.runtime; const fxTarget = ctx.GetEffectRenderTarget(ctx.fxIndex); renderer.SetRenderTarget(fxTarget); const opts = ctx.opts; if (opts && opts.preTransform) opts.preTransform(); if (isDebug) renderer.ClearRgba(1, 0, 0, 1); renderer.ClearRect2(ctx.clearRect); if (ctx.inst) { const [sheetWidth,sheetHeight] = ctx.inst.GetCurrentSurfaceSize(); const instTexRect = ctx.inst.GetCurrentTexRect(); if (instTexRect) ctx.srcRect.copy(instTexRect); else ctx.srcRect.set(0, 0, 0, 0); const paramArr = ctx.wi.GetInstanceEffectList().GetEffectParametersForIndex(effectType.GetIndex()); renderer.SetProgramParameters(ctx.renderTarget, ctx.rcTexDest, ctx.srcRect, ctx.srcRect, ctx.layoutRect, 1 / sheetWidth, 1 / sheetHeight, ctx.layerScale, ctx.layerAngle, runtime.GetGameTime(), paramArr); renderer.SetCurrentZ(ctx.wi.GetTotalZElevation()); ctx.inst.Draw(renderer); renderer.SetCurrentZ(0); ctx.rcTexDest.clampFlipped(0, 1, 1, 0); ctx.screenRect.shuntY(ctx.drawHeight); if (isDebugFrame) DebugLogRenderTargetContents("First bounce", renderer, fxTarget) } else { const paramArr = (ctx.layer || ctx.layout).GetEffectList().GetEffectParametersForIndex(effectType.GetIndex()); renderer.SetProgramParameters(ctx.renderTarget, ctx.rcTexDest, ctx.rcTexBounce, ctx.rcTexOrigin, ctx.layoutRect, 1 / ctx.drawWidth, 1 / ctx.drawHeight, ctx.layerScale, ctx.layerAngle, runtime.GetGameTime(), paramArr); const renderSurface = (ctx.layer || ctx.layout).GetRenderTarget(); if (isDebugFrame) DebugLogRenderTargetContents("Layer target", renderer, renderSurface); renderer.DrawRenderTarget(renderSurface); renderer.InvalidateRenderTarget(renderSurface); runtime.GetCanvasManager().ReleaseAdditionalRenderTarget(renderSurface); if (isDebugFrame) DebugLogRenderTargetContents("First bounce", renderer, fxTarget) } } function RenderBounce(ctx, effectType, isLast, i) { const renderer = ctx.renderer; const runtime = ctx.runtime; let fxTarget; let paramArr; if (i === 0 && ctx.preDraw && ctx.inst) ctx.screenRect.shuntY(ctx.drawHeight); if (isLast) { if (ctx.inst) renderer.SetBlendMode(ctx.wi.GetBlendMode()); else if (ctx.layer) renderer.SetBlendMode(ctx.layer.GetBlendMode()); fxTarget = ctx.renderTarget; renderer.SetRenderTarget(fxTarget) } else { fxTarget = ctx.GetEffectRenderTarget(ctx.fxIndex); renderer.SetRenderTarget(fxTarget); if (isDebug) renderer.ClearRgba(1, 0, 0, 1); renderer.ClearRect2(ctx.clearRect) } if (ctx.inst) paramArr = ctx.wi.GetInstanceEffectList().GetEffectParametersForIndex(effectType.GetIndex()); else paramArr = (ctx.layer || ctx.layout).GetEffectList().GetEffectParametersForIndex(effectType.GetIndex()); renderer.SetProgramParameters(ctx.renderTarget, ctx.rcTexDest, ctx.rcTexBounce, ctx.rcTexOrigin, ctx.layoutRect, 1 / ctx.surfaceWidth, 1 / ctx.surfaceHeight, ctx.layerScale, ctx.layerAngle, runtime.GetGameTime(), paramArr); const srcTarget = ctx.GetEffectRenderTarget(ctx.otherFxIndex); renderer.SetTexture(srcTarget.GetTexture()); runtime.GetCanvasManager().SetDeviceTransform(renderer); ctx.didChangeTransform = true; tempQuad.setFromRect(ctx.screenRect); renderer.Quad3(tempQuad, ctx.rcTexBounce); if (!ctx.inst) renderer.InvalidateRenderTarget(srcTarget); if (isDebugFrame) DebugLogRenderTargetContents("Bounce " + i, renderer, fxTarget) } function PostDraw(ctx, activeEffectTypes) { const renderer = ctx.renderer; if (ctx.layout) { renderer.SetTextureFillMode(); renderer.SetRenderTarget(ctx.renderTarget); const srcTarget = ctx.GetEffectRenderTarget(ctx.otherFxIndex); renderer.CopyRenderTarget(srcTarget); renderer.InvalidateRenderTarget(srcTarget); return } const canvasManager = ctx.runtime.GetCanvasManager(); if (canvasManager.GetCurrentFullscreenScalingQuality() === "low") { renderer.SetTextureFillMode(); canvasManager.SetDeviceTransform(renderer, canvasManager.GetDrawWidth(), canvasManager.GetDrawHeight()); ctx.didChangeTransform = true } else renderer.SetDeviceTransformTextureFillMode(); if (ctx.inst) renderer.SetBlendMode(ctx.wi.GetBlendMode()); else if (ctx.layer) renderer.SetBlendMode(ctx.layer.GetBlendMode()); renderer.SetRenderTarget(ctx.renderTarget); const srcTarget = ctx.GetEffectRenderTarget(ctx.otherFxIndex); renderer.SetTexture(srcTarget.GetTexture()); tempQuad.setFromRect(ctx.screenRect); renderer.Quad3(tempQuad, ctx.rcTexBounce); if (!ctx.inst) renderer.InvalidateRenderTarget(srcTarget); if (isDebugFrame) DebugLogRenderTargetContents("Post-draw", renderer, ctx.renderTarget) } } ;'use strict'; { const C3 = self.C3; const NAMES_REGEXP = new RegExp("<(.+?)>","g"); C3.TimelineManager = class TimelineManager extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._timelineDataManager = C3.New(C3.TimelineDataManager); this._pluginInstance = null; this._timelines = []; this._timelinesByName = new Map; this._objectClassToTimelineMap = new Map; this._timelinesCreatedByTemplate = new Map; this._scheduledTimelines = []; this._playingTimelines = []; this._hasRuntimeListeners = false; this._changingLayout = false; this._isTickingTimelines = false; this._tickFunc = ()=>this._OnTick(); this._tick2Func = ()=>this._OnTick2(); this._beforeLayoutChange = ()=>this._OnBeforeChangeLayout(); this._layoutChange = ()=>this._OnAfterChangeLayout(); this._instanceDestroy = e=>this._OnInstanceDestroy(e.instance); this._afterLoad = e=>this._OnAfterLoad(); this._destroyedWhileLoadingState = [] } Release() { this.RemoveRuntimeListeners(); this._tickFunc = null; this._tick2Func = null; this._beforeLayoutChange = null; this._layoutChange = null; this._instanceDestroy = null; this._afterLoad = null; for (const timeline of this._timelines) { timeline.Stop(); timeline.Release() } C3.clearArray(this._timelines); this._timelines = null; this._timelineDataManager.Release(); this._timelineDataManager = null; C3.clearArray(this._scheduledTimelines); this._scheduledTimelines = null; C3.clearArray(this._playingTimelines); this._playingTimelines = null; this._timelinesByName.clear(); this._timelinesByName = null; this._objectClassToTimelineMap.clear(); this._objectClassToTimelineMap = null; this._timelinesCreatedByTemplate.clear(); this._timelinesCreatedByTemplate = null; C3.clearArray(this._destroyedWhileLoadingState); this._destroyedWhileLoadingState = null; this._runtime = null } AddRuntimeListeners() { const dispatcher = this._runtime.Dispatcher(); dispatcher.addEventListener("pretick", this._tickFunc); dispatcher.addEventListener("tick2", this._tick2Func); dispatcher.addEventListener("beforelayoutchange", this._beforeLayoutChange); dispatcher.addEventListener("layoutchange", this._layoutChange); dispatcher.addEventListener("instancedestroy", this._instanceDestroy); dispatcher.addEventListener("afterload", this._afterLoad) } RemoveRuntimeListeners() { const dispatcher = this._runtime.Dispatcher(); dispatcher.removeEventListener("pretick", this._tickFunc); dispatcher.removeEventListener("tick2", this._tick2Func); dispatcher.removeEventListener("beforelayoutchange", this._beforeLayoutChange); dispatcher.removeEventListener("layoutchange", this._layoutChange); dispatcher.removeEventListener("instancedestroy", this._instanceDestroy); dispatcher.removeEventListener("afterload", this._afterLoad) } Create(timelineData) { this._timelineDataManager.Add(timelineData); const timeline = C3.TimelineState.CreateInitial(timelineData, this); this.Add(timeline); this.SetTimelineObjectClassesToMap(timeline); this._timelinesCreatedByTemplate.set(timeline.GetName(), 0) } CreateFromTemplate(template) { const timelineDataManager = this.GetTimelineDataManager(); const templateName = template.GetTemplateName(); const timelineDataItem = timelineDataManager.Get(templateName); const timeline = C3.TimelineState.CreateFromTemplate(`${templateName}:${this._timelinesCreatedByTemplate.get(templateName)}`, timelineDataItem, this); this._IncreaseTemplateTimelinesCount(templateName); this.Add(timeline); return timeline } _IncreaseTemplateTimelinesCount(templateName) { this._timelinesCreatedByTemplate.set(templateName, this._timelinesCreatedByTemplate.get(templateName) + 1) } _SetCreatedTemplateTimelinesCount() { for (const timeline of this._timelines) { if (timeline.IsTemplate()) continue; const templateName = timeline.GetTemplateName(); this._IncreaseTemplateTimelinesCount(templateName) } } _ClearCreatedTemplateTimelinesCount() { for (const templateName of this._timelinesCreatedByTemplate.keys()) this._timelinesCreatedByTemplate.set(templateName, 0) } Add(timeline) { this._timelines.push(timeline); this._timelinesByName.set(timeline.GetName().toLowerCase(), timeline) } Remove(timeline) { if (timeline.IsTemplate()) return; C3.arrayFindRemove(this._timelines, timeline); C3.arrayFindRemove(this._scheduledTimelines, timeline); C3.arrayFindRemove(this._playingTimelines, timeline); this._timelinesByName.delete(timeline.GetName().toLowerCase()); this.RemoveTimelineFromObjectClassMap(timeline); if (!timeline.IsReleased()) timeline.Release() } Trigger(method) { this._runtime.Trigger(method, this._pluginInstance, null) } GetRuntime() { return this._runtime } GetTimelineDataManager() { return this._timelineDataManager } SetPluginInstance(inst) { this._pluginInstance = inst } GetPluginInstance() { return this._pluginInstance } *GetTimelines() { for (const timeline of this._timelines) yield timeline } SetTimelineObjectClassToMap(objectClass, timeline) { if (!this._objectClassToTimelineMap.has(objectClass)) this._objectClassToTimelineMap.set(objectClass, new Set); this._objectClassToTimelineMap.get(objectClass).add(timeline) } SetTimelineObjectClassesToMap(timeline) { for (const objectClass of timeline.GetObjectClasses()) this.SetTimelineObjectClassToMap(objectClass, timeline) } RemoveTimelineFromObjectClassMap(timeline) { for (const [objectClass,timelines] of this._objectClassToTimelineMap.entries()) if (timelines.has(timeline)) { timelines.delete(timeline); if (timelines.size === 0) this._objectClassToTimelineMap.delete(objectClass) } } GetTimelinesForObjectClass(objectClass) { if (!this._objectClassToTimelineMap.has(objectClass)) return; return this._objectClassToTimelineMap.get(objectClass) } GetTimelineOfTemplateForInstances(templateTimeline, instancesObject) { if (!instancesObject) return; for (const timeline of this._timelines) { const found = instancesObject.every(io=>{ return timeline.HasTrackInstance(io.instance, io.trackId) } ); if (found) if (timeline.GetName().includes(templateTimeline.GetName())) return timeline } } GetTimelineByName(name) { return this._timelinesByName.get(name.toLowerCase()) || null } GetScheduledOrPlayingTimelineByName(name) { for (const timeline of this._scheduledTimelines) if (timeline.GetName() === name) return timeline; for (const timeline of this._playingTimelines) if (timeline.GetName() === name) return timeline; return null } *GetTimelinesByName(name) { if (NAMES_REGEXP.test(name)) { NAMES_REGEXP.lastIndex = 0; let match; const uniqueNames = new Set; do { match = NAMES_REGEXP.exec(name); if (match) { const names = match[1].split(","); for (const name of names) uniqueNames.add(name) } } while (match); for (const name of uniqueNames.values()) { const timeline = this.GetTimelineByName(name); if (timeline) yield timeline } uniqueNames.clear() } else { const timeline = this.GetTimelineByName(name); if (timeline) yield timeline } } *GetTimelinesByTags(tags) { for (const timeline of this._timelines) if (timeline.HasTags(tags)) yield timeline } AddScheduledTimeline(timeline) { if (!this._scheduledTimelines.includes(timeline)) this._scheduledTimelines.push(timeline); this._MaybeEnableRuntimeListeners() } RemovePlayingTimeline(timeline) { C3.arrayFindRemove(this._playingTimelines, timeline); this._MaybeDisableRuntimeListeners() } ScheduleTimeline(timeline) { if (this._playingTimelines.includes(timeline)) { timeline.SetPlaying(true); timeline.SetScheduled(false); timeline.SetMarkedForRemoval(false) } else { timeline.SetPlaying(false); timeline.SetScheduled(true); timeline.SetMarkedForRemoval(false); if (!this._scheduledTimelines.includes(timeline)) this._scheduledTimelines.push(timeline) } this._MaybeEnableRuntimeListeners() } DeScheduleTimeline(timeline) { timeline.SetPlaying(false); timeline.SetScheduled(false); timeline.ResolvePlayPromise(); C3.arrayFindRemove(this._scheduledTimelines, timeline); this._MaybeDisableRuntimeListeners() } CompleteTimeline(timeline) { timeline.SetPlaying(false); timeline.SetScheduled(false); timeline.SetMarkedForRemoval(true) } CompleteTimelineAndResolve(timeline) { this.CompleteTimeline(timeline); timeline.ResolvePlayPromise() } _OnTick() { if (this.GetRuntime().IsLoadingState()) return; if (!this._hasRuntimeListeners) return; if (this._changingLayout) return; let renderChange = false; this._isTickingTimelines = true; while (this._scheduledTimelines.length) { const timeline = this._scheduledTimelines.pop(); timeline.SetInitialState(); this._playingTimelines.push(timeline) } const dt = this._runtime.GetDt(); const ts = this._runtime.GetTimeScale(); for (const t of this._playingTimelines) { if (t.IsMarkedForRemoval()) continue; const change = t.Tick(dt, ts); if (!renderChange && change) renderChange = true } this._isTickingTimelines = false; if (renderChange) this.GetRuntime().UpdateRender() } _OnTick2() { if (this.GetRuntime().IsLoadingState()) return; if (!this._hasRuntimeListeners) return; if (this._changingLayout) return; let timelinesToRemove; for (const t of this._playingTimelines) { if (!t.IsMarkedForRemoval()) continue; if (!timelinesToRemove) timelinesToRemove = new Set; this._MaybeExecuteTimelineFinishTriggers(t); timelinesToRemove.add(t) } if (timelinesToRemove) C3.arrayRemoveAllInSet(this._playingTimelines, timelinesToRemove); this._MaybeDisableRuntimeListeners() } _MaybeExecuteTimelineFinishTriggers(timeline) { if (timeline.IsReleased()) return; if (!timeline.HasValidTracks()) return; if (timeline.IsComplete() && timeline.InitialStateSet()) timeline.FinishTriggers() } _MaybeEnableRuntimeListeners() { if (this._hasRuntimeListeners) return; this._hasRuntimeListeners = true } _MaybeDisableRuntimeListeners() { if (this._playingTimelines.length) return; if (this._scheduledTimelines.length) return; if (this._isTickingTimelines) return; this._hasRuntimeListeners = false } _OnBeforeChangeLayout() { this._changingLayout = true; while (this._scheduledTimelines.length) this.DeScheduleTimeline(this._scheduledTimelines.pop()); const timelinesToRemove = new Set; for (const t of this._playingTimelines) { const remove = t._OnBeforeChangeLayout(); if (remove) timelinesToRemove.add(t) } C3.arrayRemoveAllInSet(this._playingTimelines, timelinesToRemove); this._MaybeDisableRuntimeListeners(); for (const timeline of this._timelines) timeline.CleanCaches() } _OnAfterChangeLayout() { this._changingLayout = false } _OnInstanceDestroy(instance) { const objectClass = instance.GetObjectClass(); const timelines = this.GetTimelinesForObjectClass(objectClass); if (!timelines) return; if (this._runtime.IsLoadingState()) this._destroyedWhileLoadingState.push(instance); else for (const timeline of timelines) { if (timeline.IsTemplate()) continue; if (timeline.IsReleased()) { this.Remove(timeline); continue } if (!timeline.HasValidTracks()) { this._MaybeExecuteTimelineFinishTriggers(timeline); this.Remove(timeline) } } } _OnAfterLoad() { for (const destroyedInstance of this._destroyedWhileLoadingState) this._OnInstanceDestroy(destroyedInstance); C3.clearArray(this._destroyedWhileLoadingState) } _SaveToJson() { return { "timelinesJson": this._SaveTimelinesToJson(), "scheduledTimelinesJson": this._SaveScheduledTimelinesToJson(), "playingTimelinesJson": this._SavePlayingTimelinesToJson(), "hasRuntimeListeners": this._hasRuntimeListeners, "changingLayout": this._changingLayout, "isTickingTimelines": this._isTickingTimelines } } _LoadFromJson(o) { if (!o) return; this._ClearCreatedTemplateTimelinesCount(); this._LoadTimelinesFromJson(o["timelinesJson"]); this._LoadScheduledTimelinesFromJson(o["scheduledTimelinesJson"]); this._LoadPlayingTimelinesFromJson(o["playingTimelinesJson"]); this._hasRuntimeListeners = !o["hasRuntimeListeners"]; this._changingLayout = !!o["changingLayout"]; this._isTickingTimelines = !!o["isTickingTimelines"]; this._SetCreatedTemplateTimelinesCount(); this._MaybeEnableRuntimeListeners(); this._MaybeDisableRuntimeListeners() } _SaveTimelinesToJson() { return this._timelines.map(timelineState=>timelineState._SaveToJson()) } _LoadTimelinesFromJson(timelinesJson) { for (const timelineJson of timelinesJson) { let timeline = this.GetTimelineByName(timelineJson["name"]); if (timeline) timeline._LoadFromJson(timelineJson); else { const templateName = this._GetTemplateNameFromJson(timelineJson); if (!templateName) continue; const templateTimeline = this.GetTimelineByName(templateName); timeline = this.CreateFromTemplate(templateTimeline); timeline._LoadFromJson(timelineJson) } if (!timeline.HasTracks()) this.Remove(timeline) } } _GetTemplateNameFromJson(timelineJson) { const name = timelineJson["name"]; const nameParts = name.split(":"); if (!nameParts || nameParts.length !== 2) return null; return nameParts[0] } _SaveScheduledTimelinesToJson() { return this._SaveTimelines(this._scheduledTimelines) } _LoadScheduledTimelinesFromJson(scheduledTimelinesJson) { this._LoadTimelines(scheduledTimelinesJson, this._scheduledTimelines) } _SavePlayingTimelinesToJson() { return this._SaveTimelines(this._playingTimelines) } _LoadPlayingTimelinesFromJson(playingTimelinesJson) { this._LoadTimelines(playingTimelinesJson, this._playingTimelines) } _IsTimelineInJson(timeline, json) { for (const name of json) if (name === timeline.GetName()) return true; return false } _SaveTimelines(collection) { return collection.map(t=>t.GetName()) } _LoadTimelines(timelinesJson, collection) { const timelinesToRemove = new Set; for (const timeline of collection) if (!this._IsTimelineInJson(timeline, timelinesJson)) timelinesToRemove.add(timeline); C3.arrayRemoveAllInSet(collection, timelinesToRemove); const ff = tn=>t=>t.GetName() === tn; for (const name of timelinesJson) { const timeline = this.GetTimelineByName(name); if (timeline) { const t = collection.find(ff(name)); if (!t) collection.push(timeline) } } } } } ;'use strict'; { const C3 = self.C3; const PING_PONG_BEGIN = 0; const PING_PONG_END = 1; C3.TimelineState = class Timeline extends C3.DefendedBase { constructor(name, timelineDataItem, timelineManager) { super(); this._runtime = timelineManager.GetRuntime(); this._timelineManager = timelineManager; this._timelineDataItem = timelineDataItem; this._name = name; this._tracks = []; for (const trackDataItem of this._timelineDataItem.GetTrackData().trackDataItems()) this._tracks.push(C3.TrackState.Create(this, trackDataItem)); this._playPromise = null; this._playResolve = null; this._playheadTime = C3.New(C3.KahanSum); this._playheadTime.Set(0); this._playbackRate = 1; this._pingPongState = PING_PONG_BEGIN; this._currentRepeatCount = 1; this._isPlaying = false; this._isScheduled = false; this._initialStateSet = false; this._complete = true; this._released = false; this._markedForRemoval = false; this._completedTick = -1; this._implicitPause = false; this._isTemplate = false; this._finishedTriggers = false; this._firstTick = false; this._lastDelta = NaN; this._tags = [""]; this._stringTags = ""; this._tagsChanged = false } static CreateInitial(timelineDataJson, timelineManager) { const timelineDataManager = timelineManager.GetTimelineDataManager(); const nameId = timelineDataManager.GetNameId(); const timelineDataItem = timelineDataManager.Get(timelineDataJson[nameId]); const timeline = C3.New(C3.TimelineState, timelineDataJson[nameId], timelineDataItem, timelineManager); timeline.SetIsTemplate(true); return timeline } static CreateFromTemplate(name, timelineDataItem, timelineManager) { return C3.New(C3.TimelineState, name, timelineDataItem, timelineManager) } static get WORLD_INSTANCE_BOX_CHANGE() { return 1 } static get LAYOUT_RENDER_CHANGE() { return C3.nextHighestPowerOfTwo(1) } Release() { if (this.IsReleased()) return; this._timelineManager.DeScheduleTimeline(this); this._timelineManager.CompleteTimelineAndResolve(this); for (const track of this._tracks) track.Release(); C3.clearArray(this._tracks); this._tracks = null; this._playheadTime.Release(); this._playheadTime = null; this._runtime = null; this._timelineManager = null; this._timelineDataItem = null; this._released = true; this._playPromise = null; this._playResolve = null } GetTimelineManager() { return this._timelineManager } GetRuntime() { return this._runtime } GetTracks() { return this._tracks } GetSimilarPropertyTracks(instance, sourceAdapter, propertyName) { const ret = []; for (const track of this._tracks) { if (instance !== track.GetInstance()) continue; const propertyTrack = track.GetPropertyTrack(propertyName); if (!propertyTrack) continue; if (sourceAdapter.constructor !== propertyTrack.GetSourceAdapter().constructor) continue; ret.push(propertyTrack) } return ret } HasTracks() { return !!this._tracks.length } GetTrackById(trackId) { for (const track of this._tracks) if (C3.equalsNoCase(track.GetId(), trackId)) return track; return null } SetName(name) { this._name = name } GetName() { return this._name } GetTimelineDataItem() { return this._timelineDataItem } GetTemplateName() { return this._timelineDataItem.GetName() } GetTotalTime() { return this._timelineDataItem.GetTotalTime() } SetTotalTime(tt) { this._timelineDataItem.SetTotalTime(tt) } GetStep() { return this._timelineDataItem.GetStep() } SetStep(s) { this._timelineDataItem.SetStep(s) } GetInterpolationMode() { return this._timelineDataItem.GetInterpolationMode() } SetInterpolationMode(im) { this._timelineDataItem.SetInterpolationMode(im) } GetResultMode() { return this._timelineDataItem.GetResultMode() } SetResultMode(rm) { this._timelineDataItem.GetResultMode(rm) } SetEase(e) { for (const track of this.GetTracks()) track.SetEase(e) } GetLoop() { return this._timelineDataItem.GetLoop() } SetLoop(l) { return this._timelineDataItem.SetLoop(l) } GetPingPong() { return this._timelineDataItem.GetPingPong() } SetPingPong(p) { return this._timelineDataItem.SetPingPong(p) } GetRepeatCount() { return this._timelineDataItem.GetRepeatCount() } SetPlaybackRate(r) { return this._playbackRate = r } GetPlaybackRate() { return this._playbackRate } IsForwardPlayBack() { if (!this.IsPlaying()) return true; return this._playbackRate > 0 } GetPlayPromise() { if (this._playPromise) return this._playPromise; this._playPromise = new Promise(resolve=>{ this._playResolve = resolve } ); return this._playPromise } ResolvePlayPromise() { if (!this._playPromise) return; this._playResolve(); this._playPromise = null; this._playResolve = null } SetTags(tags) { this._tags = C3.TimelineState._GetTagArray(tags); this._tagsChanged = true } GetTags() { return this._tags } GetStringTags() { if (this._tagsChanged) this._stringTags = this._tags.join(" "); this._tagsChanged = false; return this._stringTags } HasTags(tags) { if (!this._tags) return false; if (!this._tags.length) return false; const t = C3.TimelineState._GetTagArray(tags); if (!t) return false; if (!t.length) return false; return t.every(C3.TimelineState._HasTag, this) } OnStarted() { C3.Plugins.Timeline.Cnds.SetTriggerTimeline(this); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineStarted); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineStartedByName); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineStartedByTags); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnAnyTimelineStarted); C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null) } OnCompleted() { this._completedTick = this._runtime.GetTickCount() } FinishTriggers() { if (this._finishedTriggers) return; this._finishedTriggers = true; C3.Plugins.Timeline.Cnds.SetTriggerTimeline(this); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineFinished); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineFinishedByName); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimelineFinishedByTags); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnAnyTimelineFinished); C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null) } SetPlaying(p) { this._isPlaying = p } IsCompletedTick() { return this._completedTick === this._runtime.GetTickCount() } IsPlaying(playingOnly=false) { if (this.IsCompletedTick()) return true; if (this.IsScheduled() && !playingOnly) return true; return this._isPlaying } _IsPlaying() { return this.IsPlaying(true) } IsPaused() { return this._IsPaused() } _IsPaused() { if (this.IsReleased()) return false; if (this.IsScheduled()) return false; if (this._IsPlaying()) return false; if (this.IsComplete()) return false; return true } SetScheduled(s) { this._isScheduled = s } IsScheduled() { return this._isScheduled } SetComplete(c) { this._complete = c; const t = this.GetTime(); if (t <= 0 || t >= this.GetTotalTime()) this._complete = true } IsComplete() { return this._complete } IsReleased() { return this._released } SetMarkedForRemoval(mfr) { this._markedForRemoval = mfr } IsMarkedForRemoval() { return this._markedForRemoval } SetImplicitPause(ip) { this._implicitPause = ip } IsImplicitPause() { return this._implicitPause } SetIsTemplate(it) { this._isTemplate = !!it } IsTemplate() { return this._isTemplate } InitialStateSet() { return this._initialStateSet } GetTime() { return this._playheadTime.Get() } SetTime(time) { const lastGlobalTime = this.GetTime(); this._SetTime(time); this.SetComplete(false); if (!this.IsComplete()) this.SetImplicitPause(true); if (!this._IsPlaying() && !this.IsScheduled() && this._initialStateSet) ; else if (!this._IsPlaying() && !this.IsScheduled() && !this._initialStateSet) this.SetInitialStateFromSetTime(); else if (this._IsPlaying()) this.Stop(); else if (this.IsScheduled()) { this._timelineManager.DeScheduleTimeline(this); this.SetInitialStateFromSetTime() } const renderChange = this._Interpolate(time, false, true, true, lastGlobalTime); if (renderChange) this.GetRuntime().UpdateRender(); this._OnSetTime() } _SetTime(time) { if (time < 0) this._playheadTime.Set(0); else if (time >= this.GetTotalTime()) this._playheadTime.Set(this.GetTotalTime()); else this._playheadTime.Set(time) } _OnSetTime() { if (!C3.Plugins.Timeline || this.constructor !== C3.TimelineState) return; C3.Plugins.Timeline.Cnds.SetTriggerTimeline(this); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimeSet); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimeSetByName); this._timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnTimeSetByTags); C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null) } _CanResume() { if (this.GetLoop()) return true; else if (this.GetPingPong() && this._pingPongState === PING_PONG_END) if (this.IsForwardPlayBack()) { if (this.GetTime() >= this.GetTotalTime()) return false } else { if (this.GetTime() <= 0) return false } else if (!this.GetLoop() && !this.GetPingPong()) if (this.IsForwardPlayBack()) { if (this.GetTime() >= this.GetTotalTime()) return false } else if (this.GetTime() <= 0) return false; return true } Resume() { if (this.IsReleased()) return; if (this._CanResume()) this.Play(true) } Play(resume=false) { if (this.IsReleased()) return false; if (this.IsScheduled()) return false; if (this._IsPlaying() && this.IsCompletedTick()) return this._SchedulePlayingTimeline(); if (this._IsPlaying()) return false; if (!this.IsComplete() && !resume && !this.IsImplicitPause()) return false; return this._ScheduleStoppedTimeline() } _SchedulePlayingTimeline() { this.SetImplicitPause(false); this._timelineManager.RemovePlayingTimeline(this); this._timelineManager.ScheduleTimeline(this); this.GetPlayPromise(); return true } _ScheduleStoppedTimeline() { this.SetImplicitPause(false); this._timelineManager.ScheduleTimeline(this); this.GetPlayPromise(); return true } Stop(completed=false) { if (this.IsReleased()) return; this.SetComplete(completed); this._timelineManager.CompleteTimeline(this); if (this.IsComplete()) this.ResolvePlayPromise() } Reset(render=true, beforeChangeLayout=false) { if (this.IsReleased()) return; if (!this._IsPlaying() && this.IsScheduled()) return this._timelineManager.DeScheduleTimeline(this); if (this.IsComplete()) return; this.Stop(true); if (this.IsForwardPlayBack()) this._SetTime(0); else this._SetTime(this.GetTotalTime()); let renderChange; const time = this.GetTime(); if (beforeChangeLayout) renderChange = this._InterpolateBeforeChangeLayout(time); else renderChange = this._Interpolate(time, false, false, true); if (render) this._OnSetTime(); if (renderChange && render) this.GetRuntime().UpdateRender() } ResetBeforeChangeLayout() { this.Reset(false, true) } _InterpolateBeforeChangeLayout(time) { this._Interpolate(time, false, false, true, NaN, false, true) } _OnBeforeChangeLayout() { if (this.IsReleased()) return true; if (this.HasValidGlobalTracks()) return false; this._timelineManager.CompleteTimeline(this); this.ResetBeforeChangeLayout(); return true } SetInitialStateFromSetTime() { this.SetInitialState(true) } SetInitialState(fromSetTime) { if (this.IsMarkedForRemoval()) return; if (fromSetTime) { this._initialStateSet = true; this._firstTick = true; for (const track of this._tracks) track.SetInitialState() } else { this.SetPlaying(true); this.SetScheduled(false); this.OnStarted(); if (this.IsComplete()) { this._completedTick = -1; this._pingPongState = PING_PONG_BEGIN; this._currentRepeatCount = 1; this._complete = false; this._finishedTriggers = false; this._initialStateSet = true; this._firstTick = true; if (this.IsForwardPlayBack()) this._SetTime(0); else this._SetTime(this.GetTotalTime()); for (const track of this._tracks) track.SetInitialState() } else { this._firstTick = true; for (const track of this._tracks) track.SetResumeState() } } } Tick(deltaTime, timeScale) { if (deltaTime === 0 && this._lastDelta === 0) return; this._lastDelta = deltaTime; const lastTime = this.GetTime(); const newDeltaTime = deltaTime * timeScale * this._playbackRate; this._SetTime(lastTime + newDeltaTime); let complete; if (!this.GetLoop() && !this.GetPingPong()) complete = this._SimpleCompleteCheck(); else if (this.GetLoop() && !this.GetPingPong()) complete = this._LoopCompleteCheck(); else if (!this.GetLoop() && this.GetPingPong()) complete = this._PingPongCompleteCheck(); else if (this.GetLoop() && this.GetPingPong()) complete = this._LoopPingPongCompleteCheck(); if (complete) { for (const track of this._tracks) track.SetEndState(); this.Stop(true); this.OnCompleted(); return true } else return this._Interpolate(this.GetTime(), true, false, false, lastTime, true) } _Interpolate(time, isTicking=false, setTime=false, ensureValue=false, lastTime=NaN, onTickCall=false, ignoreGlobals=false) { let renderChange = false; for (const track of this._tracks) track.BeforeInterpolate(); for (const track of this._tracks) { let t = time; if (typeof lastTime === "number") { const globalTime = this.GetTime(); const localTime = globalTime - track.GetStartOffset(); const lastLocalTime = lastTime - track.GetStartOffset(); if (localTime < 0 && lastLocalTime > 0) { t = track.GetStartOffset(); this._SetTime(t) } } const change = track.Interpolate(t, isTicking, setTime, ensureValue, this._firstTick, ignoreGlobals); if (!renderChange && change) renderChange = true } for (const track of this._tracks) track.AfterInterpolate(); if (this._firstTick && onTickCall) this._firstTick = false; return renderChange } _SimpleCompleteCheck() { if (this.IsForwardPlayBack()) { if (this.GetTime() >= this.GetTotalTime()) if (this._currentRepeatCount < this.GetRepeatCount()) { this._currentRepeatCount++; this._SetTime(0) } else { this._SetTime(this.GetTotalTime()); return true } } else if (this.GetTime() <= 0) if (this._currentRepeatCount < this.GetRepeatCount()) { this._currentRepeatCount++; this._SetTime(this.GetTotalTime()) } else { this._SetTime(0); return true } return false } _LoopCompleteCheck() { if (this.IsForwardPlayBack()) { if (this.GetTime() >= this.GetTotalTime()) this._SetTime(0) } else if (this.GetTime() <= 0) this._SetTime(this.GetTotalTime()); return false } _PingPongCompleteCheck() { if (this.IsForwardPlayBack()) { if (this.GetTime() >= this.GetTotalTime()) { this._SetTime(this.GetTotalTime()); this.SetPlaybackRate(this.GetPlaybackRate() * -1); if (this._pingPongState === PING_PONG_END) if (this._currentRepeatCount < this.GetRepeatCount()) { this._currentRepeatCount++; this._pingPongState = PING_PONG_BEGIN } else return true; else if (this._pingPongState === PING_PONG_BEGIN) this._pingPongState = PING_PONG_END } } else if (this.GetTime() <= 0) { this._SetTime(0); this.SetPlaybackRate(this.GetPlaybackRate() * -1); if (this._pingPongState === PING_PONG_END) if (this._currentRepeatCount < this.GetRepeatCount()) { this._currentRepeatCount++; this._pingPongState = PING_PONG_BEGIN } else return true; else if (this._pingPongState === PING_PONG_BEGIN) this._pingPongState = PING_PONG_END } return false } _LoopPingPongCompleteCheck() { if (this.IsForwardPlayBack()) { if (this.GetTime() >= this.GetTotalTime()) { this._SetTime(this.GetTotalTime()); this.SetPlaybackRate(this.GetPlaybackRate() * -1) } } else if (this.GetTime() <= 0) { this._SetTime(0); this.SetPlaybackRate(this.GetPlaybackRate() * -1) } return false } AddTrack() { const trackDataItem = this._timelineDataItem.GetTrackData().AddEmptyTrackDataItem(); const track = C3.TrackState.Create(this, trackDataItem); this._tracks.push(track); return track } CleanCaches() { for (const track of this._tracks) track.CleanCaches() } ClearTrackInstances() { for (const track of this._tracks) track.ClearInstance() } SetTrackInstance(trackId, instance) { if (!instance) return; for (const track of this._tracks) if (trackId) { if (track.GetId() !== trackId) continue; track.SetInstance(instance); this._timelineManager.SetTimelineObjectClassToMap(instance.GetObjectClass(), this); break } else { if (track.HasInstance()) continue; track.SetInstance(instance); this._timelineManager.SetTimelineObjectClassToMap(instance.GetObjectClass(), this); break } } HasTrackInstance(instance, trackId) { for (const track of this._tracks) if (trackId) { if (trackId === track.GetId() && instance === track.GetInstance()) return true } else if (instance === track.GetInstance()) return true; return false } HasValidTracks() { return this._tracks.some(t=>t.CanInstanceBeValid()) } HasValidGlobalTracks() { return this._tracks.some(t=>{ if (!t.CanInstanceBeValid()) return false; const objectClass = t.GetObjectClass(); if (!objectClass) return false; return objectClass.IsGlobal() } ) } GetPropertyTrack(propertyName) { for (const track of this.GetTracks()) for (const propertyTrack of track.GetPropertyTracks()) if (propertyTrack.GetPropertyName() === propertyName) return propertyTrack } GetKeyframeWithTags(tags) { let tagsArray = tags ? tags.split(" ") : []; const tagsSet = new Set(tagsArray.map(t=>t.toLowerCase().trim())); tagsArray = [...tagsSet.values()]; for (const track of this.GetTracks()) for (const keyframeDataItem of track.GetKeyframeDataItems()) { const hasAllTags = tagsArray.every(t=>keyframeDataItem.HasTag(t)); if (hasAllTags) return keyframeDataItem } } GetObjectClasses() { const ret = []; for (const track of this.GetTracks()) ret.push(track.GetObjectClass()); return ret.filter(oc=>oc) } _SaveToJson() { return { "tracksJson": this._SaveTracksToJson(), "name": this._name, "playheadTime": this.GetTime(), "playbackRate": this._playbackRate, "pingPongState": this._pingPongState, "currentRepeatCount": this._currentRepeatCount, "isPlaying": this._isPlaying, "isScheduled": this._isScheduled, "initialStateSet": this._initialStateSet, "finishedTriggers": this._finishedTriggers, "complete": this._complete, "released": this._released, "markedForRemoval": this._markedForRemoval, "completedTick": this._completedTick, "implicitPause": this._implicitPause, "isTemplate": this._isTemplate, "tags": this._tags.join(" "), "stringTags": this._stringTags, "tagsChanged": this._tagsChanged, "firstTick": this._firstTick } } _LoadFromJson(o) { if (!o) return; this._LoadTracksFromJson(o["tracksJson"]); this._name = o["name"]; this._playheadTime.Set(o["playheadTime"]); this._playbackRate = o["playbackRate"]; this._pingPongState = o["pingPongState"]; this._currentRepeatCount = o["currentRepeatCount"]; this._isPlaying = !!o["isPlaying"]; this._isScheduled = !!o["isScheduled"]; this._initialStateSet = !!o["initialStateSet"]; this._finishedTriggers = o.hasOwnProperty("finishedTriggers") ? !!o["finishedTriggers"] : false; this._complete = !!o["complete"]; this._released = !!o["released"]; this._markedForRemoval = !!o["markedForRemoval"]; this._completedTick = o["completedTick"]; this._implicitPause = !!o["implicitPause"]; this._isTemplate = !!o["isTemplate"]; this._tags = o["tags"].split(" "); this._stringTags = o["stringTags"]; this._tagsChanged = !!o["tagsChanged"]; this._firstTick = !!o["firstTick"] } _SaveTracksToJson() { return this._tracks.map(trackState=>trackState._SaveToJson()) } _LoadTracksFromJson(tracksJson) { tracksJson.forEach((trackJson,i)=>{ const track = this._tracks[i]; track._LoadFromJson(trackJson) } ); this._tracks.filter(track=>track.CanInstanceBeValid()) } static _HasTag(tag) { const tags = this.GetTags(); if (tag === "") return tags.length === 1 && tags[0] === ""; return tags.includes(tag) } static _GetTagArray(tags) { if (C3.IsArray(tags)) return tags.slice(0); if (C3.IsString(tags)) return tags.split(" ") } } } ;'use strict'; { const C3 = self.C3; C3.TrackState = class Track extends C3.DefendedBase { constructor(timeline, trackDataItem) { super(); this._timeline = timeline; this._trackDataItem = trackDataItem; this._trackData = trackDataItem.GetTrackData(); this._instanceUid = NaN; this._objectClassIndex = NaN; this._instance = null; this._worldInfo = null; this._isNested = trackDataItem.GetStartOffset() > 0; this._initialStateOfNestedSet = false; this._endStateOfNestedSet = false; this._lastKeyframeDataItem = null; this._keyframeDataItems = this._trackDataItem.GetKeyframeData().GetKeyframeDataItemArray(); this._propertyTracks = []; for (const propertyTrackDataItem of this._trackDataItem.GetPropertyTrackData().propertyTrackDataItems()) this._propertyTracks.push(C3.PropertyTrackState.Create(this, propertyTrackDataItem)) } static Create(timeline, trackDataItem) { return C3.New(C3.TrackState, timeline, trackDataItem) } Release() { this._keyframeDataItems = null; for (const propertyTrack of this._propertyTracks) propertyTrack.Release(); C3.clearArray(this._propertyTracks); this._propertyTracks = null; this._timeline = null; this._instance = null; this._worldInfo = null; this._trackDataItem = null; this._lastKeyframeDataItem = null } CleanCaches() { for (const propertyTrack of this._propertyTracks) propertyTrack.CleanCaches(); this._instance = null; this._worldInfo = null } GetTimeline() { return this._timeline } GetRuntime() { return this._timeline.GetRuntime() } GetKeyframeDataItems() { if (this._keyframeDataItems) return this._keyframeDataItems; this._keyframeDataItems = this._trackDataItem.GetKeyframeData().GetKeyframeDataItemArray(); return this._keyframeDataItems } GetPropertyTracks() { return this._propertyTracks } GetPropertyTrack(propertyName) { for (const propertyTrack of this._propertyTracks) if (propertyTrack.GetPropertyName() === propertyName) return propertyTrack } MaybeGetInstance() { if (!this._instance) this.GetInstance() } IsInstanceValid() { if (!this._instance) return false; return !this._instance.IsDestroyed() } CanInstanceBeValid() { const uid = this.GetInstanceUID(); const instance = this.GetRuntime().GetInstanceByUID(uid); if (!instance) return false; return !instance.IsDestroyed() } GetObjectClass() { const index = this.GetObjectClassIndex(); if (index === -1) return; return this.GetRuntime().GetObjectClassByIndex(index) } ClearInstance() { this._instance = null; this._instanceUid = -1; this._worldInfo = null; this._objectClassIndex = -1 } HasInstance() { return !!this._instance } GetInstance() { if (this._instance && this.IsInstanceValid()) return this._instance; const uid = this.GetInstanceUID(); this._instance = this.GetRuntime().GetInstanceByUID(uid); return this._instance } SetInstance(instance) { if (this._instance === instance) return; this.CleanCaches(); this._instance = instance; this._objectClassIndex = instance.GetObjectClass().GetIndex(); this._instanceUid = instance.GetUID(); this._worldInfo = instance.GetWorldInfo(); for (const item of this.propertyTrackItems()) { const propertyTrack = item.propertyTrack; const sourceAdapter = item.sourceAdapter; const id = propertyTrack.GetSourceAdapterId(); switch (id) { case "instance-variable": { const index = sourceAdapter.GetEditorIndex(); const objectClass = instance.GetObjectClass(); const i = objectClass.GetInstanceVariableIndexByName(item.name); const name = objectClass.GetInstanceVariableName(i); const type = objectClass.GetInstanceVariableType(i); if (name === item.name && type === item.type) sourceAdapter.UpdateInstanceVariableIndex(i); break } case "behavior": { const timelineBehaviorType = item.behaviorType; const trackObjectClass = this.GetObjectClass(); const objectClass = instance.GetObjectClass(); const instanceBehaviorType = sourceAdapter.GetBehaviorType(objectClass); if (timelineBehaviorType && instanceBehaviorType) { const name = timelineBehaviorType.GetName(); const templateBehaviorIndex = trackObjectClass.GetBehaviorIndexByName(name); const instanceBehaviorIndex = objectClass.GetBehaviorIndexByName(name); const propertyIndex = sourceAdapter.GetEditorIndex(); sourceAdapter.UpdateBehaviorTypeSid(instanceBehaviorType.GetSID()) } break } } } } *propertyTrackItems() { for (const propertyTrack of this._propertyTracks) { const sourceAdapter = propertyTrack.GetSourceAdapter(); const objectClass = this.GetObjectClass(); const ret = { propertyTrack: propertyTrack, sourceAdapter: sourceAdapter }; switch (propertyTrack.GetSourceAdapterId()) { case "world-instance": { ret.property = propertyTrack.GetPropertyName(); break } case "instance-variable": { const index = sourceAdapter.GetEditorIndex(); ret.name = objectClass.GetInstanceVariableName(index); ret.type = objectClass.GetInstanceVariableType(index); break } case "effect": { const effectList = objectClass.GetEffectList(); const effectType = sourceAdapter.GetEffectType(effectList); ret.effectType = effectType; break } case "behavior": { const behaviorType = sourceAdapter.GetBehaviorType(objectClass); ret.behaviorType = behaviorType; break } case "plugin": { ret.plugin = objectClass.GetPlugin(); break } } yield ret } } GetWorldInfo() { if (this._worldInfo && this.IsInstanceValid()) return this._worldInfo; const instance = this.GetInstance(); if (instance) this._worldInfo = instance.GetWorldInfo(); return this._worldInfo } GetTrackDataItem() { return this._trackDataItem } GetInstanceUID() { if (this._instanceUid) return this._instanceUid; return this._trackDataItem.GetInstanceUID() } SetInstanceUID(uid) { this._trackDataItem.SetInstanceUID(uid) } GetInterpolationMode() { return this._trackDataItem.GetInterpolationMode() } SetInterpolationMode(im) { this._trackDataItem.SetInterpolationMode(im) } GetResultMode() { return this._trackDataItem.GetResultMode() } GetId() { return this._trackDataItem.GetId() } GetStartOffset() { return this._trackDataItem.GetStartOffset() } GetLocalTotalTime() { return this._trackDataItem.GetLocalTotalTime() } SetResultMode(rm) { this._trackDataItem.SetResultMode(rm) } SetEase(e) { for (const keyframeDataItem of this.GetKeyframeDataItems()) keyframeDataItem.SetEase(e); for (const propertyTrack of this.GetPropertyTracks()) propertyTrack.SetEase(e) } GetEnable() { return this._trackDataItem.GetEnable() } SetEnable(e) { this._trackDataItem.SetEnable(e) } GetObjectClassIndex() { if (!isNaN(this._objectClassIndex)) return this._objectClassIndex; return this._trackDataItem.GetObjectClassIndex() } SetObjectClassIndex(objectClassIndex) { this._trackDataItem.SetObjectClassIndex(objectClassIndex) } SetOriginalWidth(w) { this._trackDataItem.SetOriginalWidth(w) } GetOriginalWidth() { return this._trackDataItem.GetOriginalWidth() } SetOriginalHeight(h) { this._trackDataItem.SetOriginalHeight(h) } GetOriginalHeight() { return this._trackDataItem.GetOriginalHeight() } SetInitialState() { this.MaybeGetInstance(); if (!this.IsInstanceValid()) return; for (const propertyTrack of this._propertyTracks) propertyTrack.SetInitialState(); const timeline = this.GetTimeline(); const isForwardPlayBack = timeline.IsForwardPlayBack(); const time = isForwardPlayBack ? 0 : this.GetLocalTotalTime(); this._lastKeyframeDataItem = this.GetLastKeyFrameBeforeTime(time); this._initialStateOfNestedSet = false; this._endStateOfNestedSet = false; this.Interpolate(time) } SetResumeState() { this.MaybeGetInstance(); if (!this.IsInstanceValid()) return; const playbackDirection = this._timeline.IsForwardPlayBack(); const time = this._timeline.GetTime() - this.GetStartOffset(); this._lastKeyframeDataItem = this.GetLastKeyFrameBeforeTime(time); for (const propertyTrack of this._propertyTracks) propertyTrack.SetResumeState() } SetEndState() { if (this.GetTimeline().IsComplete()) return; this.MaybeGetInstance(); if (!this.IsInstanceValid()) return; if (!this._isNested) { const time = this._timeline.GetTime(); const totalTime = this.GetStartOffset() + this.GetLocalTotalTime(); if (time >= totalTime) this.Interpolate(this.GetLocalTotalTime(), true, false, true); else if (time <= 0) this.Interpolate(0, true, false, true) } } BeforeInterpolate() { for (const propertyTrack of this._propertyTracks) propertyTrack.BeforeInterpolate() } Interpolate(time, isTicking=false, setTime=false, ensureValue=false, firstTick=false, ignoreGlobals=false) { this.MaybeGetInstance(); if (!this.IsInstanceValid()) return false; if (ignoreGlobals && this.GetObjectClass().IsGlobal()) return false; time = time - this.GetStartOffset(); if (time < 0) return false; this.MaybeSetInitialStateOfNestedTrack(time, isTicking); this.MaybeTriggerKeyframeReachedConditions(time, isTicking, firstTick); let boxChange = false; let renderChange = false; for (const propertyTrack of this._propertyTracks) { const change = propertyTrack.Interpolate(time, setTime, false, ensureValue); if (!boxChange && (change & C3.TimelineState.WORLD_INSTANCE_BOX_CHANGE) !== 0) boxChange = true; if (!renderChange && (change & C3.TimelineState.LAYOUT_RENDER_CHANGE) !== 0) renderChange = true } this.MaybeSetEndStateOfNestedTrack(time, isTicking); if (boxChange) { const worldInfo = this.GetWorldInfo(); if (worldInfo) worldInfo.SetBboxChanged() } return renderChange } AfterInterpolate() { for (const propertyTrack of this._propertyTracks) propertyTrack.AfterInterpolate() } MaybeSetInitialStateOfNestedTrack(time, isTicking) { if (!isTicking) return; if (!this._isNested) return; if (this._initialStateOfNestedSet) return; const timeline = this.GetTimeline(); if (timeline.IsForwardPlayBack()) { if (time < 0) return; for (const propertyTrack of this._propertyTracks) propertyTrack.Interpolate(0, false, false, true) } else { if (time > this.GetLocalTotalTime()) return; for (const propertyTrack of this._propertyTracks) propertyTrack.Interpolate(this.GetLocalTotalTime(), false, false, true) } for (const propertyTrack of this._propertyTracks) propertyTrack.SetInitialState(); this._initialStateOfNestedSet = true } MaybeSetEndStateOfNestedTrack(time, isTicking) { if (!isTicking) return; if (!this._isNested) return; if (this._endStateOfNestedSet) return; const timeline = this.GetTimeline(); if (timeline.IsForwardPlayBack()) { if (time >= this.GetLocalTotalTime()) { for (const propertyTrack of this._propertyTracks) propertyTrack.Interpolate(this.GetLocalTotalTime(), false, false, true); this._endStateOfNestedSet = true } } else if (time <= 0) { for (const propertyTrack of this._propertyTracks) propertyTrack.Interpolate(0, false, false, true); this._endStateOfNestedSet = true } } MaybeTriggerKeyframeReachedConditions(time, isTicking, firstTick) { if (firstTick) return; if (!isTicking) return; let keyframeDataItem = this.GetLastKeyFrameBeforeTime(time); if (keyframeDataItem !== this._lastKeyframeDataItem) this.OnKeyframeReached(keyframeDataItem); this._lastKeyframeDataItem = keyframeDataItem; return keyframeDataItem } GetLastKeyFrameBeforeTime(time) { const timeline = this.GetTimeline(); let keyframeDataItem = this._trackData.GetKeyFrameDataItemAtTime(time, this._trackDataItem); if (keyframeDataItem) return keyframeDataItem; else if (timeline.IsForwardPlayBack()) return this._trackData.GetFirstKeyFrameDataItemLowerOrEqualThan(time, this._trackDataItem); else return this._trackData.GetFirstKeyFrameDataItemHigherOrEqualThan(time, this._trackDataItem) } OnKeyframeReached(keyframeDataItem) { if (!C3.Plugins.Timeline || this.GetTimeline().constructor !== C3.TimelineState) return; const timeline = this.GetTimeline(); C3.Plugins.Timeline.Cnds.SetTriggerTimeline(timeline); C3.Plugins.Timeline.Cnds.SetTriggerKeyframe(keyframeDataItem); const timelineManager = timeline.GetTimelineManager(); timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnAnyKeyframeReached); timelineManager.Trigger(C3.Plugins.Timeline.Cnds.OnKeyframeReached); C3.Plugins.Timeline.Cnds.SetTriggerTimeline(null); C3.Plugins.Timeline.Cnds.SetTriggerKeyframe(null) } AddKeyframe() { const keyframeData = this._trackDataItem.GetKeyframeData(); const keyframeDataItem = keyframeData.AddEmptyKeyframeDataItem(); return keyframeDataItem } AddPropertyTrack() { const propertyTrackData = this._trackDataItem.GetPropertyTrackData(); const propertyTrackDataItem = propertyTrackData.AddEmptyPropertyTrackDataItem(); const propertyTrack = C3.PropertyTrackState.Create(this, propertyTrackDataItem); this._propertyTracks.push(propertyTrack); return propertyTrack } DeleteKeyframes(match) { const keyframeData = this._trackDataItem.GetKeyframeData(); keyframeData.DeleteKeyframeDataItems(match) } DeletePropertyKeyframes(match) { for (const propertyTrack of this._propertyTracks) propertyTrack.DeletePropertyKeyframes(match) } SaveState() { for (const propertyTrack of this._propertyTracks) propertyTrack.SaveState() } CompareInitialStateWithCurrent() { this.MaybeGetInstance(); if (!this.IsInstanceValid()) return; for (const propertyTrack of this._propertyTracks) propertyTrack.CompareInitialStateWithCurrent() } CompareSaveStateWithCurrent() { this.MaybeGetInstance(); if (!this.IsInstanceValid()) return; let difference = false; for (const propertyTrack of this._propertyTracks) { const diff = propertyTrack.CompareSaveStateWithCurrent(); if (!difference && diff) difference = true } if (difference) { const keyframeDataItem = this.AddKeyframe(); keyframeDataItem.SetTime(this.GetTimeline().GetTime()); keyframeDataItem.SetEase("noease"); keyframeDataItem.SetEnable(true); keyframeDataItem.SetTags("") } } _SaveToJson() { const instance = this.GetInstance(); const uid = instance ? instance.GetUID() : this.GetInstanceUID(); return { "propertyTracksJson": this._SavePropertyTracksToJson(), "lastKeyframeDataItemJson": this._SaveLastKeyframeDataItemToJson(), "initialStateOfNestedSet": this._initialStateOfNestedSet, "endStateOfNestedSet": this._endStateOfNestedSet, "instanceUid": uid } } _LoadFromJson(o) { if (!o) return; this._LoadPropertyTracksFromJson(o["propertyTracksJson"]); this._LoadLastKeyframeDataItemFromJson(o["lastKeyframeDataItemJson"]); this._LoadInstanceFromJson(o["instanceUid"]); this._initialStateOfNestedSet = false; if (o.hasOwnProperty["initialStateOfNestedSet"]) this._initialStateOfNestedSet = o["initialStateOfNestedSet"]; this._endStateOfNestedSet = false; if (o.hasOwnProperty["endStateOfNestedSet"]) this._endStateOfNestedSet = o["endStateOfNestedSet"] } _SaveLastKeyframeDataItemToJson() { const keyframeData = this._trackDataItem.GetKeyframeData(); return keyframeData.GetKeyframeDataItemIndex(this._lastKeyframeDataItem) } _SavePropertyTracksToJson() { return this._propertyTracks.map(propertyTrackState=>propertyTrackState._SaveToJson()) } _LoadPropertyTracksFromJson(propertyTracksJson) { propertyTracksJson.forEach((propertyTrackJson,i)=>{ const propertyTrack = this._propertyTracks[i]; propertyTrack._LoadFromJson(propertyTrackJson) } ) } _LoadInstanceFromJson(uid) { if (!C3.IsFiniteNumber(uid)) return; const instance = this.GetRuntime().GetInstanceByUID(uid); if (!instance) return; const timeline = this.GetTimeline(); timeline.ClearTrackInstances(); timeline.SetTrackInstance(this._trackDataItem.GetId(), instance) } _LoadLastKeyframeDataItemFromJson(lastKeyframeDataItemIndex) { const keyframeData = this._trackDataItem.GetKeyframeData(); this._lastKeyframeDataItem = keyframeData.GetKeyframeDataItemFromIndex(lastKeyframeDataItemIndex) } } } ;'use strict'; { const C3 = self.C3; C3.PropertyTrackState = class PropertyTrack extends C3.DefendedBase { constructor(track, propertyTrackDataItem) { super(); this._track = track; this._propertyTrackDataItem = propertyTrackDataItem; this._propertyTrackData = propertyTrackDataItem.GetPropertyTrackData(); this._sourceAdapter = this.GetSourceAdapter(); this._propertyKeyframeDataItems = this._propertyTrackDataItem.GetPropertyKeyframeData().GetPropertyKeyframeDataItemArray() } static Create(track, propertyTrackDataItem) { return C3.New(C3.PropertyTrackState, track, propertyTrackDataItem) } Release() { this._track = null; if (this._sourceAdapter) { this._sourceAdapter.Release(); this._sourceAdapter = null } this._propertyKeyframeDataItems = null; this._propertyTrackDataItem = null; this._propertyTrackData = null } GetTrack() { return this._track } GetPropertyTrackDataItem() { return this._propertyTrackDataItem } GetPropertyTrackData() { return this._propertyTrackData } GetTimeline() { return this._track.GetTimeline() } GetRuntime() { return this._track.GetRuntime() } GetInstance() { return this._track.GetInstance() } GetSourceAdapter() { if (this._sourceAdapter) return this._sourceAdapter; const id = this._propertyTrackDataItem.GetSourceAdapterId(); let ret; switch (id) { case "behavior": ret = new C3.PropertyTrackState.BehaviorSourceAdapter(this); break; case "effect": ret = new C3.PropertyTrackState.EffectSourceAdapter(this); break; case "instance-variable": ret = new C3.PropertyTrackState.InstanceVariableSourceAdapter(this); break; case "plugin": ret = new C3.PropertyTrackState.PluginSourceAdapter(this); break; case "world-instance": ret = new C3.PropertyTrackState.WorldInstanceSourceAdapter(this); break; case "value": ret = new C3.PropertyTrackState.ValueSourceAdapter(this); break } this._sourceAdapter = ret; return this._sourceAdapter } GetSourceAdapterId() { return this._propertyTrackDataItem.GetSourceAdapterId() } SetSourceAdapterId(said) { this._propertyTrackDataItem.SetSourceAdapterId(said) } GetSourceAdapterArgs() { return this._propertyTrackDataItem.GetSourceAdapterArguments() } SetSourceAdapterArgs(sargs) { this._propertyTrackDataItem.SetSourceAdapterArguments(sargs) } GetSourceAdapterValue() { return this.GetSourceAdapter().GetValue() } GetPropertyName() { return this._propertyTrackDataItem.GetProperty() } SetPropertyName(pn) { this._propertyTrackDataItem.SetProperty(pn) } GetPropertyType() { return this._propertyTrackDataItem.GetType() } SetPropertyType(pt) { this._propertyTrackDataItem.SetType(pt) } GetPropertyKeyframeType() { return this.GetPropertyTrackData().GetFirstPropertyKeyframeDataItem(this._propertyTrackDataItem).GetType() } GetMin() { return this._propertyTrackDataItem.GetMin() } SetMin(min) { this._propertyTrackDataItem.SetMin(min) } GetMax() { return this._propertyTrackDataItem.GetMax() } SetMax(max) { this._propertyTrackDataItem.SetMax(max) } GetEnable() { return this._propertyTrackDataItem.GetEnable() } SetEnable(e) { this._propertyTrackDataItem.SetEnable(e) } GetInterpolationMode() { return this._propertyTrackDataItem.GetInterpolationMode() } SetInterpolationMode(im) { this._propertyTrackDataItem.SetInterpolationMode(im) } GetResultMode() { return this._propertyTrackDataItem.GetResultMode() } SetResultMode(rm) { this._propertyTrackDataItem.SetResultMode(rm) } SetEase(e) { for (const propertyKeyframeDataItem of this.GetPropertyKeyframeDataItems()) propertyKeyframeDataItem.SetEase(e) } GetPropertyKeyframeDataItems() { if (this._propertyKeyframeDataItems) return this._propertyKeyframeDataItems; this._propertyKeyframeDataItems = this._propertyTrackDataItem.GetPropertyKeyframeData().GetPropertyKeyframeDataItemArray(); return this._propertyKeyframeDataItems } *GetPropertyKeyframeValues() { for (const propertyKeyframeDataItem of this.GetPropertyKeyframeDataItems()) yield propertyKeyframeDataItem.GetValueWithResultMode() } CleanCaches() { this.GetSourceAdapter().CleanCaches() } GetCurrentState() { return this.GetSourceAdapter().GetCurrentState() } SetInitialState() { this.GetSourceAdapter().SetInitialState() } SetResumeState() { this.GetSourceAdapter().SetResumeState() } BeforeInterpolate() { this.GetSourceAdapter().BeforeInterpolate() } Interpolate(time, setTime=false, noChange=false, ensureValue=false) { const propertyTrackDataItem = this._propertyTrackDataItem; let start = this._propertyTrackData.GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem); let end; if (start) end = this._propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherThan(time, propertyTrackDataItem); else { start = this._propertyTrackData.GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem); end = this._propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem) } return this.GetSourceAdapter().Interpolate(time, start, end, setTime, noChange, ensureValue) } AfterInterpolate() { this.GetSourceAdapter().AfterInterpolate() } static GetStartPropertyKeyframeForTime(time, propertyTrack) { const propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack._propertyTrackData; let start = propertyTrackData.GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem); if (!start) start = propertyTrackData.GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem); return start } static GetEndPropertyKeyframeForTime(time, propertyTrack) { const propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack._propertyTrackData; let end = propertyTrackData.GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem); if (end) return propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherThan(time, propertyTrackDataItem); else return propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem) } AddPropertyKeyframe() { const propertyKeyframeData = this._propertyTrackDataItem.GetPropertyKeyframeData(); const propertyKeyframeDataItem = propertyKeyframeData.AddEmptyPropertyKeyframeDataItem(); return propertyKeyframeDataItem } DeletePropertyKeyframes(match) { const propertyKeyframeData = this._propertyTrackDataItem.GetPropertyKeyframeData(); propertyKeyframeData.DeletePropertyKeyframeDataItems(match) } SaveState() { this.GetSourceAdapter().SaveState() } CompareInitialStateWithCurrent() { const difference = this.GetSourceAdapter().CompareInitialStateWithCurrent(); if (difference) { const propertyKeyframeDataItem = this._propertyTrackData.GetFirstPropertyKeyframeDataItem(this._propertyTrackDataItem); const currentState = this.GetSourceAdapter().GetCurrentState(); propertyKeyframeDataItem.SetAbsoluteValue(currentState) } } CompareSaveStateWithCurrent() { const difference = this.GetSourceAdapter().CompareSaveStateWithCurrent(); if (difference) this.AddPropertyKeyframeAtCurrentTime(); this.GetSourceAdapter().ClearSaveState(); return difference } AddPropertyKeyframeAtCurrentTime() { const time = this.GetTimeline().GetTime(); const sourceAdapter = this.GetSourceAdapter(); const startPropertyKeyframe = C3.PropertyTrackState.GetStartPropertyKeyframeForTime(time, this); const propertyKeyframeDataItem = this.AddPropertyKeyframe(); propertyKeyframeDataItem.SetType(startPropertyKeyframe.GetType()); propertyKeyframeDataItem.SetTime(time); propertyKeyframeDataItem.SetEase(startPropertyKeyframe.GetEase()); propertyKeyframeDataItem.SetEnable(true); propertyKeyframeDataItem.SetValue(sourceAdapter.GetValueAtTime()); propertyKeyframeDataItem.SetAbsoluteValue(sourceAdapter.GetCurrentState()) } _SaveToJson() { return { "sourceAdapterJson": this.GetSourceAdapter()._SaveToJson() } } _LoadFromJson(o) { if (!o) return; this.GetSourceAdapter()._LoadFromJson(o["sourceAdapterJson"]) } } } ;'use strict'; { const C3 = self.C3; const NS = C3.PropertyTrackState; NS.PropertySourceAdapter = class PropertySourceAdapter { constructor(propertyTrack) { this._propertyTrack = propertyTrack; this._propertyAdapter = null } Release() { if (this._propertyAdapter) { this._propertyAdapter.Release(); this._propertyAdapter = null } this._propertyTrack = null } GetPropertyTrack() { return this._propertyTrack } CleanCaches() { if (this._propertyAdapter) this._propertyAdapter.CleanCaches() } GetPropertyAdapter() { if (this._propertyAdapter) return this._propertyAdapter; this._propertyAdapter = this._CreatePropertyAdapter(); return this._propertyAdapter } GetEditorIndex() {} GetIndex() { return this.GetEditorIndex() } GetTarget() {} SetInitialState() { this.GetPropertyAdapter().SetInitialState() } SetResumeState() { this.GetPropertyAdapter().SetResumeState() } BeforeInterpolate() { this.GetPropertyAdapter().BeforeChangeProperty() } Interpolate(time, start, end, setTime, noChange, ensureValue) { const interpolateFunc = NS.PropertySourceAdapter.GetInterpolateFunc(this._propertyTrack); const value = interpolateFunc(time, start, end, this._propertyTrack); if (noChange) return value; return this.GetPropertyAdapter().ChangeProperty(time, value, start, end, setTime, ensureValue) } AfterInterpolate() { this.GetPropertyAdapter().AfterChangeProperty() } SaveState() { this.GetPropertyAdapter().SetSaveState() } ClearSaveState() { this.GetPropertyAdapter().ClearSaveState() } GetCurrentState() { return this.GetPropertyAdapter().GetCurrentState() } CompareInitialStateWithCurrent() { return this.GetPropertyAdapter().CompareInitialStateWithCurrent() } CompareSaveStateWithCurrent() { return this.GetPropertyAdapter().CompareSaveStateWithCurrent() } GetValueAtTime() { return NS.PropertySourceAdapter.GetValueAtTime(this._propertyTrack) } _CreatePropertyAdapter() { const propertyType = this._propertyTrack.GetPropertyType(); const keyframePropertyType = this._propertyTrack.GetPropertyKeyframeType(); switch (keyframePropertyType) { case "combo": case "boolean": case "text": case "string": { return new NS.PropertyInterpolationAdapter.NoInterpolationAdapter(this) } case "numeric": case "number": case "angle": { if (propertyType === "combo") return new NS.PropertyInterpolationAdapter.NoInterpolationAdapter(this); return new NS.PropertyInterpolationAdapter.NumericInterpolationAdapter(this) } case "color": case "offsetColor": { return new NS.PropertyInterpolationAdapter.ColorInterpolationAdapter(this) } } } _SaveToJson() { return { "propertyAdapterJson": this.GetPropertyAdapter()._SaveToJson() } } _LoadFromJson(o) { if (!o) return; this.GetPropertyAdapter()._LoadFromJson(o["propertyAdapterJson"]) } static GetValueAtTime(propertyTrack) { const track = propertyTrack.GetTrack(); const time = track.GetTimeline().GetTime(); const start = NS.GetStartPropertyKeyframeForTime(time, propertyTrack); const end = NS.GetEndPropertyKeyframeForTime(time, propertyTrack); const interpolateFunc = NS.PropertySourceAdapter.GetInterpolateFunc(propertyTrack); return interpolateFunc(time, start, end, propertyTrack) } static GetValue(propertyTrack, initialValue, value) { let resultMode = propertyTrack.GetResultMode(); if (propertyTrack.GetPropertyType() === "combo") resultMode = "absolute"; switch (resultMode) { case "relative": return initialValue + value; case "absolute": return value } } static GetInterpolateFunc(propertyTrack) { const type = propertyTrack.GetPropertyKeyframeType(); switch (type) { case "numeric": return NS.NumericTypeAdapter.Interpolate; case "angle": return NS.AngleTypeAdapter.Interpolate; case "boolean": return NS.BooleanTypeAdapter.Interpolate; case "color": return NS.ColorTypeAdapter.Interpolate; case "text": return NS.TextTypeAdapter.Interpolate } } static GetWillChangeFunc(propertyTrack) { const type = propertyTrack.GetPropertyKeyframeType(); switch (type) { case "numeric": return NS.NumericTypeAdapter.WillChange; case "angle": return NS.AngleTypeAdapter.WillChange; case "boolean": return NS.BooleanTypeAdapter.WillChange; case "color": return NS.ColorTypeAdapter.WillChange; case "text": return NS.TextTypeAdapter.WillChange } } } } ;'use strict'; { const C3 = self.C3; class WorldInstanceSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter { constructor(propertyTrack) { super(propertyTrack) } } C3.PropertyTrackState.WorldInstanceSourceAdapter = WorldInstanceSourceAdapter } ;'use strict'; { const C3 = self.C3; const INDEX = 0; class InstanceVariableSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter { constructor(propertyTrack) { super(propertyTrack); this._updatedIndex = NaN } GetEditorIndex() { return this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX] } GetIndex() { if (this._updatedIndex) return this._updatedIndex; return super.GetIndex() } GetTarget() { return this._propertyTrack.GetTrack().GetInstance() } UpdateInstanceVariableIndex(index) { const i = this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX]; if (i === index) return; this._updatedIndex = index } Interpolate(time, start, end, setTime, noChange, ensureValue) { if (!this.GetPropertyAdapter().CanChange(start.GetValue())) return; return super.Interpolate(time, start, end, setTime, noChange, ensureValue) } _SaveToJson() { return Object.assign(super._SaveToJson(), { "index": this._updatedIndex }) } _LoadFromJson(o) { if (!o) return; super._LoadFromJson(o); this._updatedIndex = o["index"] } } C3.PropertyTrackState.InstanceVariableSourceAdapter = InstanceVariableSourceAdapter } ;'use strict'; { const C3 = self.C3; const SID = 0; const INDEX = 1; const NAME = 2; class BehaviorSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter { constructor(propertyTrack) { super(propertyTrack); this._sid = NaN } GetEditorIndex() { const dataItem = this._propertyTrack.GetPropertyTrackDataItem(); return dataItem.GetSourceAdapterArguments()[INDEX] } GetTarget() { const dataItem = this._propertyTrack.GetPropertyTrackDataItem(); const track = this._propertyTrack.GetTrack(); const sid = this._sid ? this._sid : dataItem.GetSourceAdapterArguments()[SID]; const instance = track.GetInstance(); const index = instance.GetBehaviorIndexBySID(sid); const behaviorInstance = instance.GetBehaviorInstances()[index]; return behaviorInstance.GetSdkInstance() } GetBehaviorType(objectClass) { const dataItem = this._propertyTrack.GetPropertyTrackDataItem(); const name = dataItem.GetSourceAdapterArguments()[NAME]; return objectClass.GetBehaviorTypeByName(name) } UpdateBehaviorTypeSid(sid) { const dataItem = this._propertyTrack.GetPropertyTrackDataItem(); if (dataItem.GetSourceAdapterArguments()[SID] === sid) return; this._sid = sid } Interpolate(time, start, end, setTime, noChange, ensureValue) { const track = this._propertyTrack.GetTrack(); const instance = track.GetInstance(); if (!this.GetBehaviorType(instance.GetObjectClass())) return; return super.Interpolate(time, start, end, setTime, noChange, ensureValue) } _SaveToJson() { return Object.assign(super._SaveToJson(), { "sid": this._sid }) } _LoadFromJson(o) { if (!o) return; super._LoadFromJson(o); this._sid = o["sid"] } } C3.PropertyTrackState.BehaviorSourceAdapter = BehaviorSourceAdapter } ;'use strict'; { const C3 = self.C3; const NAME = 0; const INDEX = 1; class EffectSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter { constructor(propertyTrack) { super(propertyTrack) } GetEditorIndex() { return this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX] } GetTarget() { const pTrack = this._propertyTrack; const track = pTrack.GetTrack(); const worldInfo = track.GetWorldInfo(); const instanceEffectList = worldInfo.GetInstanceEffectList(); const effectList = instanceEffectList.GetEffectList(); const effectType = this.GetEffectType(effectList); const effectIndex = effectType.GetIndex(); if (instanceEffectList.IsEffectIndexActive(effectIndex)) return instanceEffectList.GetEffectParametersForIndex(effectIndex); return null } GetEffectType(effectList) { const pTrack = this._propertyTrack; const name = pTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[NAME]; return effectList.GetEffectTypeByName(name) } Interpolate(time, start, end, setTime, noChange, ensureValue) { if (!this._IsEffectActive()) return; return super.Interpolate(time, start, end, setTime, noChange, ensureValue) } _IsEffectActive() { const pTrack = this._propertyTrack; const track = pTrack.GetTrack(); const worldInfo = track.GetWorldInfo(); const instanceEffectList = worldInfo.GetInstanceEffectList(); const effectList = instanceEffectList.GetEffectList(); const effectType = this.GetEffectType(effectList); if (!effectType) return; const effectIndex = effectType.GetIndex(); return instanceEffectList.IsEffectIndexActive(effectIndex) } } C3.PropertyTrackState.EffectSourceAdapter = EffectSourceAdapter } ;'use strict'; { const C3 = self.C3; const INDEX = 0; class PluginSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter { constructor(propertyTrack) { super(propertyTrack) } GetEditorIndex() { return this._propertyTrack.GetPropertyTrackDataItem().GetSourceAdapterArguments()[INDEX] } GetTarget() { return this._propertyTrack.GetTrack().GetInstance().GetSdkInstance() } Interpolate(time, start, end, setTime, noChange, ensureValue) { const track = this._propertyTrack.GetTrack(); const templatePlugin = track.GetObjectClass().GetPlugin(); const currentPlugin = track.GetInstance().GetObjectClass().GetPlugin(); if (templatePlugin !== currentPlugin) return; return super.Interpolate(time, start, end, setTime, noChange, ensureValue) } } C3.PropertyTrackState.PluginSourceAdapter = PluginSourceAdapter } ;'use strict'; { const C3 = self.C3; class ValueSourceAdapter extends C3.PropertyTrackState.PropertySourceAdapter { constructor(propertyTrack) { super(propertyTrack); this._value = 0; this._init = false } SetInitialState() { const propertyTrackData = this._propertyTrack.GetPropertyTrackData(); let propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem(); propertyTrackDataItem = propertyTrackData.GetFirstPropertyKeyframeDataItem(propertyTrackDataItem); this._value = propertyTrackDataItem.GetValueWithResultMode() } SetResumeState() {} GetValue() { if (!this._init) this._propertyTrack.Interpolate(0); return this._value } Interpolate(time, start, end, setTime, noChange, ensureValue) { const interpolateFunc = C3.PropertyTrackState.NumericTypeAdapter.Interpolate; this._value = interpolateFunc(time, start, end, this._propertyTrack); this._init = true } SaveState() {} ClearSaveState() {} GetCurrentState() { return this._value } CompareInitialStateWithCurrent() { return false } CompareSaveStateWithCurrent() { return false } _SaveToJson() { return { "value": this._value, "init": this._init } } _LoadFromJson(o) { if (!o) return; this._value = o["value"]; this._init = o.hasOwnProperty("init") ? o["init"] : true } } C3.PropertyTrackState.ValueSourceAdapter = ValueSourceAdapter } ;'use strict'; { const C3 = self.C3; C3.PropertyTrackState.PropertyInterpolationAdapter = class PropertyInterpolationAdapter { constructor(sourceAdapter) { this._sourceAdapter = sourceAdapter; this._propertyTrack = sourceAdapter.GetPropertyTrack(); this._worldInfo = this._propertyTrack.GetTrack().GetWorldInfo(); this._property = this._propertyTrack.GetPropertyName(); this._firstAbsoluteUpdate = false; this._saveState = null; this._target = null } Release() { this._sourceAdapter = null; this._propertyTrack = null; this._worldInfo = null; this._saveState = null; this._target = null } CleanCaches() { this._worldInfo = null; this._saveState = null; this._target = null } GetPropertyTrack() { return this._propertyTrack } GetWorldInfo() { if (this._worldInfo) return this._worldInfo; this._worldInfo = this._propertyTrack.GetTrack().GetWorldInfo(); return this._worldInfo } SetFirstAbsoluteUpdate(f) { this._firstAbsoluteUpdate = !!f } GetFirstAbsoluteUpdate() { return this._firstAbsoluteUpdate } SetInitialState() {} SetResumeState() {} SetSaveState() { this._saveState = this.GetCurrentState() } ClearSaveState() { this._saveState = null } GetCurrentState() {} CompareInitialStateWithCurrent() {} CompareSaveStateWithCurrent() {} CanChange(value) { const targetType = typeof this._Getter(); const newType = typeof value; return targetType === newType } BeforeChangeProperty() {} ChangeProperty(time, value, start, end, setTime) {} AfterChangeProperty() {} _FirstKeyframeGetter() { const propertyKeyframeDataItem = this._PickTimelinePlaybackMode(()=>{ const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = this._propertyTrack.GetPropertyTrackData(); return propertyTrackData.GetFirstPropertyKeyframeDataItem(propertyTrackDataItem) } , ()=>{ const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = this._propertyTrack.GetPropertyTrackData(); return propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem) } ); return propertyKeyframeDataItem.GetAbsoluteValue() } _CurrentKeyframeGetter() { const timeline = this._propertyTrack.GetTimeline(); const time = timeline.GetTime() - this._propertyTrack.GetTrack().GetStartOffset(); const propertyKeyframe = this._PickTimelinePlaybackMode(()=>{ const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = this._propertyTrack.GetPropertyTrackData(); return propertyTrackData.GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem) } , ()=>{ const propertyTrackDataItem = this._propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = this._propertyTrack.GetPropertyTrackData(); const ret = propertyTrackData.GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem); if (!ret) return propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); return ret } ); return propertyKeyframe.GetAbsoluteValue() } _PickTimelinePlaybackMode(forwardFunc, backwardFunc) { const timeline = this._propertyTrack.GetTimeline(); return timeline.IsForwardPlayBack() ? forwardFunc() : backwardFunc() } _PickResultMode(relativeFunc, absoluteFunc) { const resultMode = this._propertyTrack.GetResultMode(); return resultMode === "relative" ? relativeFunc() : absoluteFunc() } _PickFirstAbsoluteUpdate(firstFunc, otherFunc) { if (this.GetFirstAbsoluteUpdate()) { this.SetFirstAbsoluteUpdate(false); return firstFunc() } else return otherFunc() } _GetAbsoluteInitialValue(keyframeValue) {} _GetIndex() { return this._sourceAdapter.GetIndex() } _GetTarget() { if (this._target) return this._target; this._target = this._sourceAdapter.GetTarget(); return this._target } _PickSource(bFunc, eFunc, ivFunc, pFunc, wiFunc) { const id = this._propertyTrack.GetSourceAdapterId(); switch (id) { case "behavior": return bFunc(); case "effect": return eFunc(); case "instance-variable": return ivFunc(); case "plugin": return pFunc(); case "world-instance": return wiFunc() } } _SaveToJson() { return { "firstAbsoluteUpdate": this._firstAbsoluteUpdate, "saveState": this._saveState } } _LoadFromJson(o) { if (!o) return; this._firstAbsoluteUpdate = o["firstAbsoluteUpdate"]; this._saveState = o["saveState"] } _GetPropertyKeyframeStubs(propertyTracks, firstOnly=false) { const ret = []; for (const propertyTrack of propertyTracks) { const startOffset = propertyTrack.GetTrack().GetStartOffset(); for (const propertyKeyframeDataItem of propertyTrack.GetPropertyKeyframeDataItems()) if (firstOnly && propertyKeyframeDataItem.GetTime() === 0) ret.push({ time: startOffset + propertyKeyframeDataItem.GetTime(), value: propertyKeyframeDataItem.GetAbsoluteValue() }); else if (!firstOnly) ret.push({ time: startOffset + propertyKeyframeDataItem.GetTime(), value: propertyKeyframeDataItem.GetAbsoluteValue() }) } return ret.sort((f,s)=>f.time - s.time) } _GetLastPropertyKeyframeStub(timeline, time, propertyKeyframeStubs) { return this._GetPropertyKeyframeStubLowerThanPlayhead(time, propertyKeyframeStubs) } _GetPropertyKeyframeStubLowerThanPlayhead(time, propertyKeyframeStubs) { for (let i = propertyKeyframeStubs.length - 1; i >= 0; i--) { const stubTime = propertyKeyframeStubs[i].time; if (stubTime <= time) return propertyKeyframeStubs[i] } return null } } } ;'use strict'; { const C3 = self.C3; const TMP_COLORS_MAP = new Map; const TMP_COLOR = [0, 0, 0]; class ColorInterpolationAdapter extends C3.PropertyTrackState.PropertyInterpolationAdapter { constructor(sourceAdapter) { super(sourceAdapter) } SetInitialState() {} SetResumeState() {} GetCurrentState() { const id = this._propertyTrack.GetSourceAdapterId(); const target = this._GetTarget(); const index = this._GetIndex(); switch (id) { case "behavior": return this._ToColorArray(target.GetPropertyValueByIndex(index)); case "effect": return this._ToColorArray(target[index]); case "plugin": return this._ToColorArray(target.GetPropertyValueByIndex(index)); case "world-instance": return this._ToColorArray(this._Getter()) } } CompareInitialStateWithCurrent() { const firstKeyframeColor = this._FirstKeyframeGetter(); return !this._CompareColors(firstKeyframeColor, this._Getter()) } CompareSaveStateWithCurrent() { if (C3.IsNullOrUndefined(this._saveState)) return false; return !this._CompareColors(this._saveState, this._Getter()) } _CompareColors(fColor, sColor) { return fColor.equalsIgnoringAlpha(sColor) } _FirstKeyframeGetter() { const color = super._FirstKeyframeGetter(); return this._GetColorFromArray(color) } _CurrentKeyframeGetter() { const color = super._CurrentKeyframeGetter(); return this._GetColorFromArray(color) } _GetAbsoluteInitialValue(value) {} _ToColorArray(color) { if (C3.IsInstanceOf(color, C3.Color)) return color.toArray().slice(0, 3); return color.slice(0, 3) } _GetColorFromArray(color) { if (C3.IsInstanceOf(color, C3.Color)) return color; return new C3.Color(color[0],color[1],color[2],1) } CanChange(value) { return true } BeforeChangeProperty() { const instance = this._propertyTrack.GetInstance(); if (!TMP_COLORS_MAP.has(instance)) TMP_COLORS_MAP.set(instance, new Map); const instanceMap = TMP_COLORS_MAP.get(instance); const id = this._propertyTrack.GetSourceAdapterId(); if (!instanceMap.has(id)) instanceMap.set(id, new Map); const sourceMap = instanceMap.get(id); if (!sourceMap.has(this._property)) sourceMap.set(this._property, { used: false, color: new C3.Color(0,0,0,1) }) } _GetTmpColor(instance, sourceId, propertyName) { const tmpColorObj = TMP_COLORS_MAP.get(instance).get(sourceId).get(propertyName); tmpColorObj.used = true; return tmpColorObj.color } ChangeProperty(time, value, start, end, setTime) { const timeline = this._propertyTrack.GetTimeline(); const track = this._propertyTrack.GetTrack(); const instance = this._propertyTrack.GetInstance(); const sourceAdapter = this._propertyTrack.GetSourceAdapter(); const sourceAdapterId = this._propertyTrack.GetSourceAdapterId(); const property = this._property; const propertyTracks = timeline.GetSimilarPropertyTracks(instance, sourceAdapter, property); if (propertyTracks.length > 1) { const propertyKeyframeStubs = this._GetPropertyKeyframeStubs(propertyTracks, true); const stub = this._GetLastPropertyKeyframeStub(timeline, timeline.GetTime(), propertyKeyframeStubs); if (stub) { const startOffset = track.GetStartOffset(); const t = stub.time - startOffset; if (t === 0) this._GetTmpColor(instance, sourceAdapterId, this._property).addRgb(value[0], value[1], value[2]); else { if (t < 0) return; const r = value[0]; const g = value[1]; const b = value[2]; const v = this._propertyTrack.Interpolate(t, false, true); const dr = C3.Color.DiffChannel(r, v[0]); const dg = C3.Color.DiffChannel(g, v[1]); const db = C3.Color.DiffChannel(b, v[2]); this._GetTmpColor(instance, sourceAdapterId, this._property).addRgb(dr, dg, db) } } } else this._Setter(value[0], value[1], value[2]); return C3.TimelineState.LAYOUT_RENDER_CHANGE } AfterChangeProperty() { const instance = this._propertyTrack.GetInstance(); if (!TMP_COLORS_MAP.has(instance)) return; const instanceMap = TMP_COLORS_MAP.get(instance); const id = this._propertyTrack.GetSourceAdapterId(); if (!instanceMap.has(id)) return; const sourceMap = instanceMap.get(id); if (!sourceMap.has(this._property)) return; const tmpColorObj = sourceMap.get(this._property); const used = tmpColorObj.used; const color = tmpColorObj.color; if (used) this._Setter(color.getR(), color.getG(), color.getB()); if (sourceMap.size === 0) instanceMap.delete(id); if (instanceMap.size === 0) TMP_COLORS_MAP.delete(instance) } _Getter() { const id = this._propertyTrack.GetSourceAdapterId(); const target = this._GetTarget(); const index = this._GetIndex(); switch (id) { case "behavior": return this._GetColorFromArray(target.GetPropertyValueByIndex(index)); case "effect": return target[index].clone(); case "plugin": return this._GetColorFromArray(target.GetPropertyValueByIndex(index)); case "world-instance": return this.GetWorldInfo().GetUnpremultipliedColor().clone() } } _Setter(r, g, b) { const id = this._propertyTrack.GetSourceAdapterId(); const target = this._GetTarget(); const index = this._GetIndex(); switch (id) { case "behavior": TMP_COLOR[0] = r; TMP_COLOR[1] = g; TMP_COLOR[2] = b; target.SetPropertyValueByIndex(index, TMP_COLOR); break; case "effect": target[index].setRgb(r, g, b); break; case "plugin": TMP_COLOR[0] = r; TMP_COLOR[1] = g; TMP_COLOR[2] = b; target.SetPropertyValueByIndex(index, TMP_COLOR); break; case "world-instance": this.GetWorldInfo().SetUnpremultipliedColorRGB(r, g, b); break } } _SaveToJson() {} _LoadFromJson(o) {} } C3.PropertyTrackState.PropertyInterpolationAdapter.ColorInterpolationAdapter = ColorInterpolationAdapter } ;'use strict'; { const C3 = self.C3; class NoInterpolationAdapter extends C3.PropertyTrackState.PropertyInterpolationAdapter { constructor(sourceAdapter) { super(sourceAdapter) } SetInitialState() {} SetResumeState() {} GetCurrentState() { return this._Getter() } CompareInitialStateWithCurrent() { const firstKeyframeValue = this._FirstKeyframeGetter(); return firstKeyframeValue !== this.GetCurrentState() } CompareSaveStateWithCurrent() { if (C3.IsNullOrUndefined(this._saveState)) return false; return this._saveState !== this.GetCurrentState() } ChangeProperty(time, value, start, end, setTime) { const willChangeFunc = C3.PropertyTrackState.PropertySourceAdapter.GetWillChangeFunc(this._propertyTrack); const propertyTrack = this._propertyTrack; const track = propertyTrack.GetTrack(); const id = propertyTrack.GetSourceAdapterId(); const timeline = propertyTrack.GetTimeline(); const instance = track.GetInstance(); const sourceAdapter = propertyTrack.GetSourceAdapter(); const property = this._property; const propertyTracks = timeline.GetSimilarPropertyTracks(instance, sourceAdapter, property); if (propertyTracks.length > 1) { const propertyKeyframeStubs = this._GetPropertyKeyframeStubs(propertyTracks); const t = time + track.GetStartOffset(); const stub = this._GetLastPropertyKeyframeStub(timeline, t, propertyKeyframeStubs); if (stub) value = stub.value } const change = willChangeFunc(this._GetIndex(), this._GetTarget(), value, id); if (!change) return; this._Setter(value); switch (id) { case "behavior": return; case "effect": return; case "instance-variable": return; case "plugin": return C3.TimelineState.LAYOUT_RENDER_CHANGE } } _Getter() { const id = this._propertyTrack.GetSourceAdapterId(); const target = this._GetTarget(); const index = this._GetIndex(); switch (id) { case "behavior": return target.GetPropertyValueByIndex(index); case "effect": return target[index]; case "instance-variable": return target.GetInstanceVariableValue(index); case "plugin": return target.GetPropertyValueByIndex(index) } } _Setter(value) { const id = this._propertyTrack.GetSourceAdapterId(); const target = this._GetTarget(); const index = this._GetIndex(); switch (id) { case "behavior": target.SetPropertyValueByIndex(index, value); break; case "effect": target[index] = value; break; case "instance-variable": target.SetInstanceVariableValue(index, value); break; case "plugin": target.SetPropertyValueByIndex(index, value); break } } } C3.PropertyTrackState.PropertyInterpolationAdapter.NoInterpolationAdapter = NoInterpolationAdapter } ;'use strict'; { const C3 = self.C3; const NS = C3.PropertyTrackState.PropertyInterpolationAdapter; const INSTANCE_FUNC_MAP = new Map; const add = (prop,setter,absolute_setter,getter,round)=>INSTANCE_FUNC_MAP.set(prop, { setter, absolute_setter, getter, round }); add("offsetX", (wi,v)=>wi.OffsetX(v), (wi,v)=>wi.SetX(v), wi=>wi.GetX(), true); add("offsetY", (wi,v)=>wi.OffsetY(v), (wi,v)=>wi.SetY(v), wi=>wi.GetY(), true); add("offsetWidth", (wi,v)=>wi.OffsetWidth(v), (wi,v)=>wi.SetWidth(v), wi=>wi.GetWidth(), true); add("offsetHeight", (wi,v)=>wi.OffsetHeight(v), (wi,v)=>wi.SetHeight(v), wi=>wi.GetHeight(), true); add("offsetAngle", (wi,v)=>wi.OffsetAngle(v), (wi,v)=>wi.SetAngle(v), wi=>wi.GetAngle(), false); add("offsetOpacity", (wi,v)=>wi.OffsetOpacity(v), (wi,v)=>wi.SetOpacity(v), wi=>wi.GetOpacity(), false); add("offsetOriginX", (wi,v)=>wi.OffsetOriginX(v), (wi,v)=>wi.SetOriginX(v), wi=>wi.GetOriginX(), false); add("offsetOriginY", (wi,v)=>wi.OffsetOriginY(v), (wi,v)=>wi.SetOriginY(v), wi=>wi.GetOriginY(), false); add("offsetZElevation", (wi,v)=>wi.OffsetZElevation(v), (wi,v)=>wi.SetZElevation(v), wi=>wi.GetZElevation(), true); add("offsetScaleX", (wi,v,t)=>{ wi.OffsetWidth(t.GetOriginalWidth() * v) } , (wi,v,t)=>{ wi.SetWidth(t.GetOriginalWidth() * v) } , (wi,t)=>{ return wi.GetWidth() / t.GetOriginalWidth() } , false); add("offsetScaleY", (wi,v,t)=>{ wi.OffsetHeight(t.GetOriginalHeight() * v) } , (wi,v,t)=>{ wi.SetHeight(t.GetOriginalHeight() * v) } , (wi,t)=>{ return wi.GetHeight() / t.GetOriginalHeight() } , false); class NumericInterpolationAdapter extends C3.PropertyTrackState.PropertyInterpolationAdapter { constructor(sourceAdapter) { super(sourceAdapter); this._lastValue = 0; this._instance_getter = null; this._instance_setter = null; this._instance_absolute_setter = null; this._round = false; if (C3.IsInstanceOf(this._propertyTrack.GetTimeline(), C3.Tween)) this._typeAdapter = new C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTween(this); else this._typeAdapter = new C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTimeline(this); const property = this._propertyTrack.GetPropertyName(); if (this._propertyTrack.GetSourceAdapterId() === "world-instance") { const p = INSTANCE_FUNC_MAP.get(property); this._instance_getter = p.getter; this._instance_setter = p.setter; this._instance_absolute_setter = p.absolute_setter; this._round = p.round } } Release() { this._typeAdapter = null; this._instance_getter = null; this._instance_setter = null; this._instance_absolute_setter = null; super.Release() } GetLastValue() { return this._lastValue } SetLastValue(v) { this._lastValue = v } SetInitialState() { const initValue = this._typeAdapter.SetInitialState(); if (typeof initValue === "number") this._lastValue = initValue } SetResumeState() { const resumeValue = this._typeAdapter.SetResumeState(); if (typeof resumeValue === "number") this._lastValue = resumeValue } GetCurrentState() { return this._Getter() } CompareInitialStateWithCurrent() { const firstKeyframeValue = this._FirstKeyframeGetter(); return firstKeyframeValue !== this.GetCurrentState() } CompareSaveStateWithCurrent() { if (C3.IsNullOrUndefined(this._saveState)) return false; return this._saveState !== this.GetCurrentState() } BeforeChangeProperty() { this._typeAdapter.BeforeChangeProperty() } ChangeProperty(time, value, start, end, setTime, ensureValue) { return this._typeAdapter.ChangeProperty(time, value, start, end, setTime, ensureValue) } AfterChangeProperty() { this._typeAdapter.AfterChangeProperty() } _Getter() { const target = this._GetTarget(); const index = this._GetIndex(); const track = this._propertyTrack.GetTrack(); const wi = this.GetWorldInfo(); return this._PickSource(()=>target.GetPropertyValueByIndex(index), ()=>target[index], ()=>target.GetInstanceVariableValue(index), ()=>target.GetPropertyValueByIndex(index), ()=>this._instance_getter(wi, track)) } _Setter(value, start, end) { const target = this._GetTarget(); const index = this._GetIndex(); const track = this._propertyTrack.GetTrack(); const wi = this.GetWorldInfo(); this._PickSource(()=>target.OffsetPropertyValueByIndex(index, value), ()=>target[index] += value, ()=>target.SetInstanceVariableOffset(index, value), ()=>target.OffsetPropertyValueByIndex(index, value), ()=>this._instance_setter(wi, value, track)) } _SetterAbsolute(value, start, end) { const target = this._GetTarget(); const index = this._GetIndex(); const track = this._propertyTrack.GetTrack(); const wi = this.GetWorldInfo(); this._PickSource(()=>target.SetPropertyValueByIndex(index, value), ()=>target[index] = value, ()=>target.SetInstanceVariableValue(index, value), ()=>target.SetPropertyValueByIndex(index, value), ()=>this._instance_absolute_setter(wi, value, track)) } _MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) { this._typeAdapter._MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) } _AddDelta(value, start, end) { const stringValue = value.toString(); const decimalsString = stringValue.split(".")[1] || ""; const decimalPlaces = decimalsString.length; const v = this._Getter(); let rv; if (decimalPlaces === 0) rv = this._round ? Math.round(v) : v; else rv = C3.toFixed(v, decimalPlaces); this._Setter(rv - v, start, end) } _SaveToJson() { return Object.assign(super._SaveToJson(), { "v": this._lastValue }) } _LoadFromJson(o) { if (!o) return; super._LoadFromJson(o); this._lastValue = o["v"] } } C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapter = NumericInterpolationAdapter } ;'use strict'; { const C3 = self.C3; const TMP_ABSOLUTE_VALUES_MAP = new Map; class NumericInterpolationAdapterForTimeline { constructor(numericInterpolationAdapter) { this._numericInterpolationAdapter = numericInterpolationAdapter } Release() { this._numericInterpolationAdapter = null } SetInitialState() { const adapter = this._numericInterpolationAdapter; const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack(); return adapter._PickResultMode(()=>{ return adapter._PickTimelinePlaybackMode(()=>0, ()=>C3.PropertyTrackState.PropertySourceAdapter.GetValueAtTime(propertyTrack)) } , ()=>{} ) } SetResumeState() {} BeforeChangeProperty() { const adapter = this._numericInterpolationAdapter; const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack(); const property = propertyTrack.GetPropertyName(); adapter._PickResultMode(()=>{} , ()=>{ const instance = propertyTrack.GetInstance(); if (!TMP_ABSOLUTE_VALUES_MAP.has(instance)) TMP_ABSOLUTE_VALUES_MAP.set(instance, new Map); const instanceMap = TMP_ABSOLUTE_VALUES_MAP.get(instance); const id = propertyTrack.GetSourceAdapterId(); if (!instanceMap.has(id)) instanceMap.set(id, new Map); const sourceMap = instanceMap.get(id); if (!sourceMap.has(property)) sourceMap.set(property, { used: false, value: 0 }) } ) } _GetTmpAbsoluteValueObject(instance, sourceId, propertyName) { const tmpAbsoluteValueObj = TMP_ABSOLUTE_VALUES_MAP.get(instance).get(sourceId).get(propertyName); tmpAbsoluteValueObj.used = true; return tmpAbsoluteValueObj } ChangeProperty(time, value, start, end, setTime, ensureValue) { const adapter = this._numericInterpolationAdapter; const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack(); const property = propertyTrack.GetPropertyName(); adapter._PickResultMode(()=>{ const lastValue = adapter.GetLastValue(); adapter._Setter(value - lastValue, start, end); if (ensureValue) this._MaybeEnsureValue(time, start, end, setTime, lastValue, value); adapter.SetLastValue(value) } , ()=>{ const timeline = propertyTrack.GetTimeline(); const track = propertyTrack.GetTrack(); const instance = propertyTrack.GetInstance(); const sourceAdapter = propertyTrack.GetSourceAdapter(); const sourceAdapterId = propertyTrack.GetSourceAdapterId(); const propertyTracks = timeline.GetSimilarPropertyTracks(instance, sourceAdapter, property); if (propertyTracks.length > 1) { const propertyKeyframeStubs = adapter._GetPropertyKeyframeStubs(propertyTracks, true); const stub = adapter._GetLastPropertyKeyframeStub(timeline, timeline.GetTime(), propertyKeyframeStubs); if (stub) { const startOffset = track.GetStartOffset(); const t = stub.time - startOffset; if (t === 0) { const valueObj = this._GetTmpAbsoluteValueObject(instance, sourceAdapterId, property); valueObj.value += value } else { if (t < 0) return; const v = propertyTrack.Interpolate(t, false, true); const valueObj = this._GetTmpAbsoluteValueObject(instance, sourceAdapterId, property); valueObj.value += value - v } } } else adapter._SetterAbsolute(value) } ); return adapter._PickSource(()=>{} , ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>{} , ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE) } AfterChangeProperty() { const adapter = this._numericInterpolationAdapter; const propertyTrack = this._numericInterpolationAdapter.GetPropertyTrack(); const property = propertyTrack.GetPropertyName(); adapter._PickResultMode(()=>{} , ()=>{ const instance = propertyTrack.GetInstance(); if (!TMP_ABSOLUTE_VALUES_MAP.has(instance)) return; const instanceMap = TMP_ABSOLUTE_VALUES_MAP.get(instance); const id = propertyTrack.GetSourceAdapterId(); if (!instanceMap.has(id)) return; const sourceMap = instanceMap.get(id); if (!sourceMap.has(property)) return; const tmpValueObj = sourceMap.get(property); const used = tmpValueObj.used; const value = tmpValueObj.value; if (used) adapter._SetterAbsolute(value); sourceMap.delete(property); if (sourceMap.size === 0) instanceMap.delete(id); if (instanceMap.size === 0) TMP_ABSOLUTE_VALUES_MAP.delete(instance) } ) } _MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) { const adapter = this._numericInterpolationAdapter; if (setTime) return; if (start && time === start.GetTime()) adapter._AddDelta(start.GetValueWithResultMode(), start, end); else if (end && time === end.GetTime()) adapter._AddDelta(end.GetValueWithResultMode(), start, end); else if (currentValue - lastValue === 0) adapter._AddDelta(start.GetValueWithResultMode(), start, end) } } C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTimeline = NumericInterpolationAdapterForTimeline } ;'use strict'; { const C3 = self.C3; const TMP_ABSOLUTE_VALUES_MAP = new Map; class NumericInterpolationAdapterForTween { constructor(numericInterpolationAdapter) { this._numericInterpolationAdapter = numericInterpolationAdapter } Release() { this._numericInterpolationAdapter = null } SetInitialState() { const adapter = this._numericInterpolationAdapter; adapter.SetFirstAbsoluteUpdate(true); return this._GetAbsoluteInitialValue(adapter._FirstKeyframeGetter()) } SetResumeState() { const adapter = this._numericInterpolationAdapter; if (adapter._FirstKeyframeGetter() === adapter._CurrentKeyframeGetter()) return; adapter.SetFirstAbsoluteUpdate(true); return this._GetAbsoluteInitialValue(adapter._CurrentKeyframeGetter()) } BeforeChangeProperty() {} ChangeProperty(time, value, start, end, setTime, ensureValue) { const adapter = this._numericInterpolationAdapter; const lastValue = adapter.GetLastValue(); adapter._PickResultMode(()=>{ adapter._Setter(value - lastValue, start, end); if (ensureValue) this._MaybeEnsureValue(time, start, end, setTime, lastValue, value) } , ()=>{ adapter._PickFirstAbsoluteUpdate(()=>{ adapter._Setter(lastValue, start, end) } , ()=>{ adapter._Setter(value - lastValue, start, end); if (ensureValue) this._MaybeEnsureValue(time, start, end, setTime, lastValue, value) } ) } ); adapter.SetLastValue(value); return adapter._PickSource(()=>{} , ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>{} , ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE, ()=>C3.TimelineState.LAYOUT_RENDER_CHANGE) } AfterChangeProperty() {} _GetAbsoluteInitialValue(keyframeValue) { const adapter = this._numericInterpolationAdapter; return keyframeValue - adapter.GetCurrentState() } _MaybeEnsureValue(time, start, end, setTime, lastValue, currentValue) { const adapter = this._numericInterpolationAdapter; if (setTime) if (start && time === start.GetTime()) adapter._AddDelta(start.GetValueWithResultMode(), start, end); else if (end && time === end.GetTime()) adapter._AddDelta(end.GetValueWithResultMode(), start, end); else { if (!end) adapter._AddDelta(start.GetValueWithResultMode(), start, end) } else if (start && time === start.GetTime()) adapter._AddDelta(start.GetValueWithResultMode(), start, end); else if (end && time === end.GetTime()) adapter._AddDelta(end.GetValueWithResultMode(), start, end); else if (currentValue - lastValue === 0) adapter._AddDelta(start.GetValueWithResultMode(), start, end) } } C3.PropertyTrackState.PropertyInterpolationAdapter.NumericInterpolationAdapterForTween = NumericInterpolationAdapterForTween } ;'use strict'; { const C3 = self.C3; const Ease = self.Ease; C3.PropertyTrackState.NumericTypeAdapter = class NumericTypeAdapter { constructor() {} static WillChange(index, source, newValue, type) { let oldValue; switch (type) { case "behavior": oldValue = source.GetPropertyValueByIndex(index); break; case "effect": oldValue = source[index]; break; case "instance-variable": oldValue = source.GetInstanceVariableValue(index); break; case "plugin": oldValue = source.GetPropertyValueByIndex(index); break } if (oldValue === newValue) return false; return true } static Interpolate(time, start, end, propertyTrack) { if (!end) { let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack.GetPropertyTrackData(); propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); return propertyTrackDataItem.GetValueWithResultMode() } let mode = propertyTrack.GetInterpolationMode(); if (mode === "default") mode = "continuous"; if (propertyTrack.GetPropertyType() === "combo") mode = "discrete"; if (mode === "discrete") return start.GetValueWithResultMode(); else if (mode === "continuous" || mode === "step") { if (mode === "step") { const step = propertyTrack.GetTimeline().GetStep(); if (step !== 0) { const s = 1 / step; time = Math.floor(time * s) / s } } const st = start.GetTime(); const et = end.GetTime(); const sv = start.GetValueWithResultMode(); const ev = end.GetValueWithResultMode(); if (sv === ev) return sv; const n = C3.normalize(time, st, et); const e = start.GetEase(); let ret; const startAddon = start.GetAddOn("cubic-bezier"); const endAddon = end.GetAddOn("cubic-bezier"); if (startAddon && startAddon.GetStartEnable() && endAddon && endAddon.GetEndEnable()) { const dt = et - st; ret = Ease.GetRuntimeEase(e)(dt * n, 0, 1, dt); ret = Ease.GetRuntimeEase("cubicbezier")(ret, sv, sv + startAddon.GetStartAnchor(), ev + endAddon.GetEndAnchor(), ev) } else ret = Ease.GetRuntimeEase(e)((et - st) * n, sv, ev - sv, et - st); if (propertyTrack.GetPropertyType() === "integer") return Math.floor(ret); return ret } } } } ;'use strict'; { const C3 = self.C3; C3.PropertyTrackState.AngleTypeAdapter = class AngleTypeAdapter { constructor() {} static WillChange(index, source, newValue, type) { let oldValue; switch (type) { case "behavior": oldValue = source.GetPropertyValueByIndex(index); break; case "effect": oldValue = source[index]; break; case "instance-variable": oldValue = source.GetInstanceVariableValue(index); break; case "plugin": oldValue = source.GetPropertyValueByIndex(index); break } if (oldValue === newValue) return false; return true } static Interpolate(time, start, end, propertyTrack) { if (!end) { let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack.GetPropertyTrackData(); propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); return propertyTrackDataItem.GetValueWithResultMode() } let mode = propertyTrack.GetInterpolationMode(); if (mode === "default") mode = "continuous"; if (propertyTrack.GetPropertyType() === "combo") mode = "discrete"; if (mode === "discrete") return start.GetValueWithResultMode(); else if (mode === "continuous" || mode === "step") { if (mode === "step") { const step = propertyTrack.GetTimeline().GetStep(); if (step !== 0) { const s = 1 / step; time = Math.floor(time * s) / s } } const st = start.GetTime(); const et = end.GetTime(); const sv = start.GetValueWithResultMode(); const ev = end.GetValueWithResultMode(); const angleAddon = start.GetAddOn("angle"); if (angleAddon) { const revolutions = angleAddon.GetRevolutions(); if (sv === ev && revolutions === 0) return sv; const n = C3.normalize(time, st, et); const easeFunc = self.Ease.GetRuntimeEase(start.GetEase()); const easeRes = easeFunc(n, 0, 1, 1); switch (angleAddon.GetDirection()) { case "closest": return C3.angleLerp(sv, ev, easeRes, revolutions); case "clockwise": return C3.angleLerpClockwise(sv, ev, easeRes, revolutions); case "anti-clockwise": return C3.angleLerpAntiClockwise(sv, ev, easeRes, revolutions) } } else { if (sv === ev) return sv; const n = C3.normalize(time, st, et); const easeFunc = self.Ease.GetRuntimeEase(start.GetEase()); return C3.angleLerp(sv, ev, easeFunc(n, 0, 1, 1)) } } } } } ;'use strict'; { const C3 = self.C3; C3.PropertyTrackState.BooleanTypeAdapter = class BooleanTypeAdapter { constructor() {} static WillChange(index, source, newValue, type) { let oldValue; switch (type) { case "behavior": oldValue = source.GetPropertyValueByIndex(index); break; case "effect": oldValue = source[index]; break; case "instance-variable": oldValue = source.GetInstanceVariableValue(index); break; case "plugin": oldValue = source.GetPropertyValueByIndex(index); break } if (!!oldValue === !!newValue) return false; return true } static Interpolate(time, start, end, propertyTrack) { if (!end) { let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack.GetPropertyTrackData(); propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); return propertyTrackDataItem.GetValueWithResultMode() ? 1 : 0 } return start.GetValueWithResultMode() ? 1 : 0 } } } ;'use strict'; { const C3 = self.C3; const TEMP_COLOR_ARRAY = [0, 0, 0]; const TEMP_COLOR_ARRAY_2 = [0, 0, 0]; const TEMP_COLOR_ARRAY_3 = [0, 0, 0]; C3.PropertyTrackState.ColorTypeAdapter = class ColorTypeAdapter { constructor() {} static WillChange(index, source, newValue, type) { let oldValue; switch (type) { case "behavior": oldValue = source.GetPropertyValueByIndex(index); break; case "effect": oldValue = source[index]; break; case "instance-variable": oldValue = source.GetInstanceVariableValue(index); break; case "plugin": oldValue = source.GetPropertyValueByIndex(index); break } if (Array.isArray(newValue)) { TEMP_COLOR_ARRAY[0] = newValue[0]; TEMP_COLOR_ARRAY[1] = newValue[1]; TEMP_COLOR_ARRAY[2] = newValue[2] } else { TEMP_COLOR_ARRAY_3.parseCommaSeparatedRgb(newValue); TEMP_COLOR_ARRAY[0] = Math.floor(TEMP_COLOR_ARRAY_3.getR() * 255); TEMP_COLOR_ARRAY[1] = Math.floor(TEMP_COLOR_ARRAY_3.getG() * 255); TEMP_COLOR_ARRAY[2] = Math.floor(TEMP_COLOR_ARRAY_3.getB() * 255) } if (Array.isArray(oldValue)) { TEMP_COLOR_ARRAY_2[0] = oldValue[0]; TEMP_COLOR_ARRAY_2[1] = oldValue[1]; TEMP_COLOR_ARRAY_2[2] = oldValue[2] } else { TEMP_COLOR_ARRAY_3.parseCommaSeparatedRgb(oldValue); TEMP_COLOR_ARRAY_2[0] = Math.floor(TEMP_COLOR_ARRAY_3.getR() * 255); TEMP_COLOR_ARRAY_2[1] = Math.floor(TEMP_COLOR_ARRAY_3.getG() * 255); TEMP_COLOR_ARRAY_2[2] = Math.floor(TEMP_COLOR_ARRAY_3.getB() * 255) } if (TEMP_COLOR_ARRAY[0] !== TEMP_COLOR_ARRAY_2[0]) return true; if (TEMP_COLOR_ARRAY[1] !== TEMP_COLOR_ARRAY_2[1]) return true; if (TEMP_COLOR_ARRAY[2] !== TEMP_COLOR_ARRAY_2[2]) return true; return false } static Interpolate(time, start, end, propertyTrack) { if (!end) { let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack.GetPropertyTrackData(); propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); const color = propertyTrackDataItem.GetValueWithResultMode(); TEMP_COLOR_ARRAY[0] = color[0]; TEMP_COLOR_ARRAY[1] = color[1]; TEMP_COLOR_ARRAY[2] = color[2]; return TEMP_COLOR_ARRAY } let mode = propertyTrack.GetInterpolationMode(); if (mode === "default") mode = "continuous"; if (mode === "discrete") { const color = start.GetValueWithResultMode(); TEMP_COLOR_ARRAY[0] = color[0]; TEMP_COLOR_ARRAY[1] = color[1]; TEMP_COLOR_ARRAY[2] = color[2]; return TEMP_COLOR_ARRAY } else if (mode === "continuous" || mode === "step") { if (mode === "step") { const step = propertyTrack.GetTimeline().GetStep(); if (step !== 0) { const s = 1 / step; time = Math.floor(time * s) / s } } const st = start.GetTime(); const et = end.GetTime(); const sv = start.GetValueWithResultMode(); const ev = end.GetValueWithResultMode(); const n = C3.normalize(time, st, et); const e = start.GetEase(); const sr = sv[0]; const sg = sv[1]; const sb = sv[2]; const er = ev[0]; const eg = ev[1]; const eb = ev[2]; const easeFunc = self.Ease.GetRuntimeEase(e); const d = et - st; const dn = d * n; if (sr === er) TEMP_COLOR_ARRAY[0] = sr; else TEMP_COLOR_ARRAY[0] = easeFunc(dn, sr, er - sr, d); if (sg === eg) TEMP_COLOR_ARRAY[1] = sg; else TEMP_COLOR_ARRAY[1] = easeFunc(dn, sg, eg - sg, d); if (sb === eb) TEMP_COLOR_ARRAY[2] = sb; else TEMP_COLOR_ARRAY[2] = easeFunc(dn, sb, eb - sb, d); return TEMP_COLOR_ARRAY } } } } ;'use strict'; { const C3 = self.C3; C3.PropertyTrackState.TextTypeAdapter = class TextTypeAdapter { constructor() {} static WillChange(index, source, newValue, type) { let oldValue; switch (type) { case "behavior": oldValue = source.GetPropertyValueByIndex(index); break; case "effect": oldValue = source[index]; break; case "instance-variable": oldValue = source.GetInstanceVariableValue(index); break; case "plugin": oldValue = source.GetPropertyValueByIndex(index); break } if (oldValue === newValue) return false; return true } static Interpolate(time, start, end, propertyTrack) { if (!end) { let propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyTrackData = propertyTrack.GetPropertyTrackData(); propertyTrackDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); return propertyTrackDataItem.GetValueWithResultMode() } return start.GetValueWithResultMode() } } } ;'use strict'; { const C3 = self.C3; C3.TimelineDataManager = class TimelineDataManager { constructor() { this._timelineDataItems = new Map } Release() { for (const timelineDataItem of this._timelineDataItems.values()) timelineDataItem.Release(); this._timelineDataItems.clear(); this._timelineDataItems = null } Add(data) { const timelineDataItem = new C3.TimelineDataItem(data); const name = timelineDataItem.GetName(); this._timelineDataItems.set(name, timelineDataItem) } Get(name) { return this._timelineDataItems.get(name) } GetNameId() { return 0 } static _CreateDataItems(items, jsonItems, dataItemConstructor, dataContainer) { if (!jsonItems) return; for (const jsonItem of jsonItems) C3.TimelineDataManager._CreateDataItem("create", jsonItem, items, dataItemConstructor, dataContainer) } static _LoadDataItemsFromJson(items, jsonItems, dataItemConstructor, dataContainer) { if (items.length) jsonItems.forEach((jsonItem,index)=>{ items[index]._LoadFromJson(jsonItem) } ); else jsonItems.forEach(jsonItem=>{ C3.TimelineDataManager._CreateDataItem("load", jsonItem, items, dataItemConstructor, dataContainer) } ) } static _CreateDataItem(mode, json, items, dataItemConstructor, dataContainer) { let dataItem; if (typeof dataItemConstructor === "function") switch (mode) { case "load": dataItem = new dataItemConstructor(null,dataContainer); break; case "create": dataItem = new dataItemConstructor(json,dataContainer); break } else if (typeof dataItemConstructor === "object") { const prop = dataItemConstructor.prop; const value = json[prop]; const cnstrctr = dataItemConstructor.map.get(value); switch (mode) { case "load": dataItem = new cnstrctr(null,dataContainer); break; case "create": dataItem = new cnstrctr(json,dataContainer); break } } switch (mode) { case "load": dataItem._LoadFromJson(json); items.push(dataItem); break; case "create": if (typeof dataItem.GetEnable === "function" && !dataItem.GetEnable()) return dataItem.Release(); items.push(dataItem); break } } } } ;'use strict'; { const C3 = self.C3; const NAME = 0; const TOTAL_TIME = 1; const STEP = 2; const INTERPOLATION_MODE = 3; const RESULT_MODE = 4; const TRACKS = 5; const LOOP = 6; const PING_PONG = 7; const REPEAT_COUNT = 8; C3.TimelineDataItem = class TimelineDataItem { constructor(timelineDataJson) { this._name = ""; this._totalTime = NaN; this._step = 0; this._interpolationMode = "default"; this._resultMode = "default"; this._loop = false; this._pingPong = false; this._repeatCount = 1; this._trackData = null; if (!timelineDataJson) return; this._name = timelineDataJson[NAME]; this._totalTime = timelineDataJson[TOTAL_TIME]; this._step = timelineDataJson[STEP]; this._interpolationMode = timelineDataJson[INTERPOLATION_MODE]; this._resultMode = timelineDataJson[RESULT_MODE]; this._loop = !!timelineDataJson[LOOP]; this._pingPong = !!timelineDataJson[PING_PONG]; this._repeatCount = timelineDataJson[REPEAT_COUNT]; this._trackData = new C3.TrackData(timelineDataJson[TRACKS],this) } Release() { this._trackData.Release(); this._trackData = null } GetTrackData() { if (!this._trackData) this._trackData = new C3.TrackData(null,this); return this._trackData } GetName() { return this._name } SetName(n) { this._name = n } GetTotalTime() { return this._totalTime } SetTotalTime(tt) { this._totalTime = tt } GetStep() { return this._step } SetStep(s) { this._step = s } GetInterpolationMode() { return this._interpolationMode } SetInterpolationMode(im) { this._interpolationMode = im } GetResultMode() { return this._resultMode } SetResultMode(rm) { this._resultMode = rm } GetLoop() { return this._loop } SetLoop(l) { this._loop = l } GetPingPong() { return this._pingPong } SetPingPong(p) { this._pingPong = p } GetRepeatCount() { return this._repeatCount } _SaveToJson() { return { "trackDataJson": this._trackData._SaveToJson(), "name": this._name, "totalTime": this._totalTime, "step": this._step, "interpolationMode": this._interpolationMode, "resultMode": this._resultMode, "loop": this._loop, "pingPong": this._pingPong, "repeatCount": this._repeatCount } } _LoadFromJson(o) { if (!o) return; this.GetTrackData()._LoadFromJson(o["trackDataJson"]); this._name = o["name"]; this._totalTime = o["totalTime"]; this._step = o["step"]; this._interpolationMode = o["interpolationMode"]; this._resultMode = o["resultMode"]; this._loop = o["loop"]; this._pingPong = o["pingPong"]; this._repeatCount = o["repeatCount"] } } } ;'use strict'; { const C3 = self.C3; const WI_DATA = 0; const OC_INDEX = 1; const WI_UID = 2; const INTERPOLATION_MODE = 1; const RESULT_MODE = 2; const ENABLED = 3; const KEYFRAMES = 4; const PROPERTY_TRACKS = 5; const ID = 6; const NESTED_DATA = 7; const START_OFFSET = 0; const LOCAL_TOTAL_TIME = 1; const WI_ADDITIONAL_DATA = 8; const ORIGINAL_WIDTH = 0; const ORIGINAL_HEIGHT = 1; class TrackDataItem { constructor(trackDataJson, trackData) { this._trackData = trackData; this._instanceData = null; this._additionalInstanceData = null; this._instanceUid = NaN; this._objectClassIndex = NaN; this._interpolationMode = "default"; this._resultMode = "default"; this._enabled = false; this._keyframeData = null; this._propertyTrackData = null; this._id = ""; this._nestedData = null; this._startOffset = 0; this._localTotalTime = this._trackData.GetTimelineDataItem().GetTotalTime(); if (!trackDataJson) return; this._instanceData = trackDataJson[WI_DATA]; this._instanceUid = trackDataJson[WI_DATA][WI_UID]; this._objectClassIndex = trackDataJson[WI_DATA][OC_INDEX]; this._interpolationMode = trackDataJson[INTERPOLATION_MODE]; this._resultMode = trackDataJson[RESULT_MODE]; this._enabled = !!trackDataJson[ENABLED]; if (trackDataJson[ID]) this._id = trackDataJson[ID]; if (trackDataJson[NESTED_DATA]) { this._nestedData = trackDataJson[NESTED_DATA]; this._startOffset = trackDataJson[NESTED_DATA][START_OFFSET]; this._localTotalTime = trackDataJson[NESTED_DATA][LOCAL_TOTAL_TIME] } if (trackDataJson[WI_ADDITIONAL_DATA]) this._additionalInstanceData = trackDataJson[WI_ADDITIONAL_DATA]; this._keyframeData = new C3.KeyframeData(trackDataJson[KEYFRAMES],this); this._propertyTrackData = new C3.PropertyTrackData(trackDataJson[PROPERTY_TRACKS],this) } Release() { this._instanceData = null; this._trackData = null; if (this._keyframeData) { this._keyframeData.Release(); this._keyframeData = null } if (this._propertyTrackData) { this._propertyTrackData.Release(); this._propertyTrackData = null } this._nestedData = null } GetTrackData() { return this._trackData } GetKeyframeData() { if (!this._keyframeData) this._keyframeData = new C3.KeyframeData(null,this); return this._keyframeData } GetPropertyTrackData() { if (!this._propertyTrackData) this._propertyTrackData = new C3.PropertyTrackData(null,this); return this._propertyTrackData } GetInstanceData() { return this._instanceData } GetObjectClassIndex() { return this._objectClassIndex } SetObjectClassIndex(index) { this._objectClassIndex = index } GetInstanceUID() { return this._instanceUid } SetInstanceUID(uid) { this._instanceUid = uid } GetInterpolationMode() { return this._interpolationMode } SetInterpolationMode(im) { this._interpolationMode = im } GetResultMode() { return this._resultMode } SetResultMode(rm) { this._resultMode = rm } GetEnable() { return this._enabled } SetEnable(e) { this._enabled = !!e } GetId() { return this._id } GetStartOffset() { return this._startOffset } GetLocalTotalTime() { return this._localTotalTime } GetOriginalWidth() { return this._additionalInstanceData[ORIGINAL_WIDTH] } SetOriginalWidth(w) { if (!this._additionalInstanceData) this._additionalInstanceData = []; this._additionalInstanceData[ORIGINAL_WIDTH] = w } GetOriginalHeight() { if (!this._additionalInstanceData) this._additionalInstanceData = []; return this._additionalInstanceData[ORIGINAL_HEIGHT] } SetOriginalHeight(h) { if (!this._additionalInstanceData) this._additionalInstanceData = []; this._additionalInstanceData[ORIGINAL_HEIGHT] = h } _SaveToJson() { return { "keyframeDataJson": this._keyframeData._SaveToJson(), "propertyTrackDataJson": this._propertyTrackData._SaveToJson(), "instanceData": this._instanceData, "additionalInstanceData": this._additionalInstanceData, "instanceUid": this._instanceUid, "objectClassIndex": this._objectClassIndex, "interpolationMode": this._interpolationMode, "resultMode": this._resultMode, "enabled": this._enabled, "id": this._id, "nestedData": this._nestedData } } _LoadFromJson(o) { if (!o) return; this._instanceData = o["instanceData"]; this._instanceUid = o["instanceUid"]; this._objectClassIndex = o["objectClassIndex"]; this._interpolationMode = o["interpolationMode"]; this._resultMode = o["resultMode"]; this._enabled = o["enabled"]; this._id = o["id"]; this._localTotalTime = this._trackData.GetTimelineDataItem().GetTotalTime(); if (o["nestedData"]) { this._nestedData = o["nestedData"]; this._startOffset = this._nestedData[START_OFFSET]; this._localTotalTime = this._nestedData[LOCAL_TOTAL_TIME] } if (o["additionalInstanceData"]) this._additionalInstanceData = o["additionalInstanceData"]; this.GetKeyframeData()._LoadFromJson(o["keyframeDataJson"]); this.GetPropertyTrackData()._LoadFromJson(o["propertyTrackDataJson"]) } } C3.TrackData = class TrackData { constructor(tracksDataJson, timelineDataItem) { this._timelineDataItem = timelineDataItem; this._trackDataItems = []; this._keyframeTimeMap = new Map; C3.TimelineDataManager._CreateDataItems(this._trackDataItems, tracksDataJson, TrackDataItem, this) } Release() { this._timelineDataItem = null; for (const trackDataItem of this._trackDataItems) trackDataItem.Release(); C3.clearArray(this._trackDataItems); this._trackDataItems = null; this._keyframeTimeMap.clear(); this._keyframeTimeMap = null } GetTimelineDataItem() { return this._timelineDataItem } AddEmptyTrackDataItem() { const trackDataItem = new TrackDataItem(null,this); this._trackDataItems.push(trackDataItem); return trackDataItem } GetFirstKeyframeDataItem(trackDataItem) { return trackDataItem.GetKeyframeData().GetKeyframeDataItemArray()[0] } GetLastKeyframeDataItem(trackDataItem) { const keyframeDataItems = trackDataItem.GetKeyframeData().GetKeyframeDataItemArray(); return keyframeDataItems[keyframeDataItems.length - 1] } GetKeyFrameDataItemAtTime(time, trackDataItem) { const keyframeDataItemEntry = this._keyframeTimeMap.get(trackDataItem); if (!!keyframeDataItemEntry && keyframeDataItemEntry.has(time)) return keyframeDataItemEntry.get(time); for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItems()) if (keyframeDataItem.GetTime() === time) { if (!keyframeDataItemEntry) this._keyframeTimeMap.set(trackDataItem, new Map); this._keyframeTimeMap.get(trackDataItem).set(time, keyframeDataItem); return keyframeDataItem } } GetFirstKeyFrameDataItemHigherThan(time, trackDataItem) { for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItems()) if (keyframeDataItem.GetTime() > time) return keyframeDataItem } GetFirstKeyFrameDataItemHigherOrEqualThan(time, trackDataItem) { for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItems()) if (keyframeDataItem.GetTime() >= time) return keyframeDataItem } GetFirstKeyFrameDataItemLowerOrEqualThan(time, trackDataItem) { for (const keyframeDataItem of trackDataItem.GetKeyframeData().keyframeDataItemsReverse()) if (keyframeDataItem.GetTime() <= time) return keyframeDataItem } *trackDataItems() { for (const trackDataItem of this._trackDataItems) yield trackDataItem } _SaveToJson() { return { "trackDataItemsJson": this._trackDataItems.map(trackDataItem=>trackDataItem._SaveToJson()) } } _LoadFromJson(o) { if (!o) return; C3.TimelineDataManager._LoadDataItemsFromJson(this._trackDataItems, o["trackDataItemsJson"], TrackDataItem, this) } } } ;'use strict'; { const C3 = self.C3; const SOURCE_DATA = 0; const SOURCE = 0; const PROPERTY = 1; const TYPE = 2; const MIN = 3; const MAX = 4; const INTERPOLATION_MODE = 5; const RESULT_MODE = 6; const ENABLED = 7; const PROPERTY_KEYFRAMES = 8; class PropertyTrackDataItem { constructor(propertyTrackDataJson, propertyTrackData) { this._propertyTrackData = propertyTrackData; this._sourceAdapterId = ""; this._sourceAdapterArguments = null; this._property = null; this._type = null; this._min = NaN; this._max = NaN; this._interpolationMode = "default"; this._resultMode = "default"; this._enabled = false; this._propertyKeyframeData = null; if (!propertyTrackDataJson) return; this._sourceAdapterId = propertyTrackDataJson[SOURCE_DATA][SOURCE]; this._sourceAdapterArguments = propertyTrackDataJson[SOURCE_DATA].slice(1); this._property = propertyTrackDataJson[PROPERTY]; this._type = propertyTrackDataJson[TYPE]; this._min = propertyTrackDataJson[MIN]; this._max = propertyTrackDataJson[MAX]; this._interpolationMode = propertyTrackDataJson[INTERPOLATION_MODE]; this._resultMode = propertyTrackDataJson[RESULT_MODE]; this._enabled = !!propertyTrackDataJson[ENABLED]; this._propertyKeyframeData = new C3.PropertyKeyframeData(propertyTrackDataJson[PROPERTY_KEYFRAMES],this) } Release() { this._propertyKeyframeData.Release(); this._propertyKeyframeData = null; this._propertyTrackData = null; this._sourceAdapterArguments = null } GetPropertyTrackData() { return this._propertyTrackData } GetPropertyKeyframeData() { if (!this._propertyKeyframeData) this._propertyKeyframeData = new C3.PropertyKeyframeData(null,this); return this._propertyKeyframeData } GetSourceAdapterId() { return this._sourceAdapterId } SetSourceAdapterId(said) { this._sourceAdapterId = said } GetSourceAdapterArguments() { return this._sourceAdapterArguments } SetSourceAdapterArguments(sargs) { this._sourceAdapterArguments = sargs } GetProperty() { return this._property } SetProperty(p) { this._property = p } GetType() { return this._type } SetType(t) { this._type = t } GetMin() { return this._min } SetMin(min) { this._min = min } GetMax() { return this._max } SetMax(max) { this._max = max } GetInterpolationMode() { return this._interpolationMode } SetInterpolationMode(im) { this._interpolationMode = im } GetResultMode() { return this._resultMode } SetResultMode(rm) { this._resultMode = rm } GetEnable() { return this._enabled } SetEnable(e) { this._enabled = !!e } _SaveToJson() { return { "propertyKeyframeDataJson": this._propertyKeyframeData._SaveToJson(), "sourceAdapterId": this._sourceAdapterId, "sourceAdapterArguments": this._sourceAdapterArguments, "property": this._property, "type": this._type, "min": this._min, "max": this._max, "interpolationMode": this._interpolationMode, "resultMode": this._resultMode, "enabled": this._enabled } } _LoadFromJson(o) { if (!o) return; this._sourceAdapterId = o["sourceAdapterId"]; this._sourceAdapterArguments = o["sourceAdapterArguments"]; this._property = o["property"]; this._type = o["type"]; this._min = o["min"]; this._max = o["max"]; this._interpolationMode = o["interpolationMode"]; this._resultMode = o["resultMode"]; this._enabled = o["enabled"]; this.GetPropertyKeyframeData()._LoadFromJson(o["propertyKeyframeDataJson"]) } } C3.PropertyTrackData = class PropertyTrackData { constructor(propertyTracksDataJson, trackDataItem) { this._trackDataItem = trackDataItem; this._propertyTrackDataItems = []; this._propertyKeyframeTimeMap = new Map; C3.TimelineDataManager._CreateDataItems(this._propertyTrackDataItems, propertyTracksDataJson, PropertyTrackDataItem, this) } Release() { this._trackDataItem = null; for (const propertyTrackDataItem of this._propertyTrackDataItems) propertyTrackDataItem.Release(); C3.clearArray(this._propertyTrackDataItems); this._propertyTrackDataItems = null; this._propertyKeyframeTimeMap.clear(); this._propertyKeyframeTimeMap = null } GetTrackDataItem() { return this._trackDataItem } AddEmptyPropertyTrackDataItem() { const propertyTrackDataItem = new PropertyTrackDataItem(null,this); this._propertyTrackDataItems.push(propertyTrackDataItem); return propertyTrackDataItem } GetFirstPropertyKeyframeDataItem(propertyTrackDataItem) { const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData(); return propertyKeyframeData.GetPropertyKeyframeDataItemArray()[0] } GetLastPropertyKeyframeDataItem(propertyTrackDataItem) { const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData(); const propertyKeyframeDataItems = propertyKeyframeData.GetPropertyKeyframeDataItemArray(); return propertyKeyframeDataItems[propertyKeyframeDataItems.length - 1] } GetPropertyKeyFrameDataItemAtTime(time, propertyTrackDataItem) { const propertyKeyframeDataItemEntry = this._propertyKeyframeTimeMap.get(propertyTrackDataItem); if (!!propertyKeyframeDataItemEntry && propertyKeyframeDataItemEntry.has(time)) return propertyKeyframeDataItemEntry.get(time); const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData(); for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItems()) if (propertyKeyframeDataItem.GetTime() === time) { if (!propertyKeyframeDataItemEntry) this._propertyKeyframeTimeMap.set(propertyTrackDataItem, new Map); this._propertyKeyframeTimeMap.get(propertyTrackDataItem).set(time, propertyKeyframeDataItem); return propertyKeyframeDataItem } } GetFirstPropertyKeyFrameDataItemHigherThan(time, propertyTrackDataItem) { const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData(); for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItems()) if (propertyKeyframeDataItem.GetTime() > time) return propertyKeyframeDataItem } GetFirstPropertyKeyFrameDataItemHigherOrEqualThan(time, propertyTrackDataItem) { const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData(); for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItems()) if (propertyKeyframeDataItem.GetTime() >= time) return propertyKeyframeDataItem } GetFirstPropertyKeyFrameDataItemLowerOrEqualThan(time, propertyTrackDataItem) { const propertyKeyframeData = propertyTrackDataItem.GetPropertyKeyframeData(); for (const propertyKeyframeDataItem of propertyKeyframeData.propertyKeyframeDataItemsReverse()) if (propertyKeyframeDataItem.GetTime() <= time) return propertyKeyframeDataItem } *propertyTrackDataItems() { for (const propertyTrackDataItem of this._propertyTrackDataItems) yield propertyTrackDataItem } _SaveToJson() { return { "propertyTrackDataItemsJson": this._propertyTrackDataItems.map(propertyTrackDataItem=>propertyTrackDataItem._SaveToJson()) } } _LoadFromJson(o) { if (!o) return; C3.TimelineDataManager._LoadDataItemsFromJson(this._propertyTrackDataItems, o["propertyTrackDataItemsJson"], PropertyTrackDataItem, this) } } } ;'use strict'; { const C3 = self.C3; const TIME = 0; const EASE = 1; const ENABLE = 2; const TAGS = 3; class KeyframeDataItem { constructor(keyframeDataJson, keyframeData) { this._keyframeData = keyframeData; this._time = -1; this._ease = "noease"; this._enable = false; this._tags = null; this._lowerTags = null; if (!keyframeDataJson) return; this._time = keyframeDataJson[TIME]; this._ease = keyframeDataJson[EASE]; this._enable = !!keyframeDataJson[ENABLE]; const tagStr = keyframeDataJson[TAGS]; this._tags = tagStr ? tagStr.split(" ") : []; this._lowerTags = new Set(this._tags.map(t=>t.toLowerCase())) } Release() { this._keyframeData = null; C3.clearArray(this._tags); this._tags = null; this._lowerTags.clear(); this._lowerTags = null } GetKeyframeData() { return this._keyframeData } GetTime() { return this._time } SetTime(t) { this._time = t } GetEase() { return this._ease } SetEase(e) { this._ease = e } GetEnable() { return this._enable } SetEnable(e) { this._enable = !!e } GetTags() { return this._tags } SetTags(t) { this._tags = t ? t.split(" ") : []; this._lowerTags = new Set(this._tags.map(t=>t.toLowerCase())) } GetLowerTags() { return this._lowerTags } HasTag(tag) { return this._lowerTags.has(tag.toLowerCase()) } _SaveToJson() { return { "time": this._time, "ease": this._ease, "enable": this._enable, "tags": this._tags } } _LoadFromJson(o) { if (!o) return; this._time = o["time"]; this._ease = o["ease"]; this._enable = o["enable"]; this._tags = o["tags"]; this._lowerTags = new Set(this._tags.map(t=>t.toLowerCase())) } } C3.KeyframeData = class KeyframeData { constructor(keyframesDataJson, trackDataItem) { this._trackDataItem = trackDataItem; this._keyframeDataItems = []; C3.TimelineDataManager._CreateDataItems(this._keyframeDataItems, keyframesDataJson, KeyframeDataItem, this) } Release() { this._trackDataItem = null; for (const keyframeDataItem of this._keyframeDataItems) keyframeDataItem.Release(); C3.clearArray(this._keyframeDataItems); this._keyframeDataItems = null } GetTrackDataItem() { return this._trackDataItem } GetKeyframeDataItemCount() { return this._keyframeDataItems.length } GetKeyframeDataItemArray() { return this._keyframeDataItems } AddEmptyKeyframeDataItem() { const keyframeDataItem = new KeyframeDataItem(null,this); this._keyframeDataItems.push(keyframeDataItem); return keyframeDataItem } DeleteKeyframeDataItems(match) { for (const keyframeDataItem of this._keyframeDataItems) { if (!match(keyframeDataItem)) continue; const index = this._keyframeDataItems.indexOf(keyframeDataItem); if (index === -1) continue; keyframeDataItem.Release(); this._keyframeDataItems.splice(index, 1) } this.SortKeyframeDataItems() } SortKeyframeDataItems() { this._keyframeDataItems.sort((a,b)=>a.GetTime() - b.GetTime()) } GetKeyframeDataItemIndex(keyframeDataItem) { return this._keyframeDataItems.indexOf(keyframeDataItem) } GetKeyframeDataItemFromIndex(index) { return this._keyframeDataItems[index] } *keyframeDataItems() { for (const keyframeDataItem of this._keyframeDataItems) yield keyframeDataItem } *keyframeDataItemsReverse() { for (let i = this._keyframeDataItems.length - 1; i >= 0; i--) yield this._keyframeDataItems[i] } _SaveToJson() { return { "keyframeDataItemsJson": this._keyframeDataItems.map(keyframeDataItem=>keyframeDataItem._SaveToJson()) } } _LoadFromJson(o) { if (!o) return; C3.TimelineDataManager._LoadDataItemsFromJson(this._keyframeDataItems, o["keyframeDataItemsJson"], KeyframeDataItem, this) } } } ;'use strict'; { const C3 = self.C3; const VALUE_DATA = 0; const VALUE_DATA_VALUE = 0; const VALUE_DATA_ABSOLUTE_VALUE = 1; const VALUE_DATA_TYPE = 2; const TIME = 1; const EASE = 2; const ENABLE = 3; const ADDONS = 4; class PropertyKeyframeDataItem { constructor(propertyKeyframeDataJson, propertyKeyframeData) { this._propertyKeyframeData = propertyKeyframeData; this._value = null; this._aValue = null; this._type = ""; this._time = NaN; this._ease = "noease"; this._enable = false; this._addonData = null; if (!propertyKeyframeDataJson) return; this._value = propertyKeyframeDataJson[VALUE_DATA][VALUE_DATA_VALUE]; this._aValue = propertyKeyframeDataJson[VALUE_DATA][VALUE_DATA_ABSOLUTE_VALUE]; this._type = propertyKeyframeDataJson[VALUE_DATA][VALUE_DATA_TYPE]; this._time = propertyKeyframeDataJson[TIME]; this._ease = propertyKeyframeDataJson[EASE]; this._enable = !!propertyKeyframeDataJson[ENABLE]; this._addonData = null; if (!!propertyKeyframeDataJson[ADDONS]) this._addonData = new C3.AddonData(propertyKeyframeDataJson[ADDONS],this) } Release() { this._propertyKeyframeData = null; if (this._addonData) { this._addonData.Release(); this._addonData = null } } GetAddonData() { return this._addonData } GetValue() { return this._value } SetValue(value) { if (this._type === "color" && C3.IsFiniteNumber(value)) { this._value[0] = C3.GetRValue(value); this._value[1] = C3.GetGValue(value); this._value[2] = C3.GetBValue(value) } else this._value = value } GetAbsoluteValue() { return this._aValue } SetAbsoluteValue(aValue) { if (this._type === "color" && C3.IsFiniteNumber(aValue)) { this._aValue[0] = C3.GetRValue(aValue); this._aValue[1] = C3.GetGValue(aValue); this._aValue[2] = C3.GetBValue(aValue) } else this._aValue = aValue } GetValueWithResultMode() { const rm = this._propertyKeyframeData.GetPropertyTrackDataItem().GetResultMode(); if (rm === "relative") return this.GetValue(); else if (rm === "absolute") return this.GetAbsoluteValue() } GetType() { return this._type } SetType(t) { this._type = t } GetTime() { return this._time } SetTime(t) { this._time = t } GetEase() { return this._ease } SetEase(e) { this._ease = e } GetEnable() { return this._enable } SetEnable(e) { this._enable = !!e } GetAddOn(id) { if (!this.GetAddonData()) return; for (const addonDataItem of this.GetAddonData().addonDataItems()) if (addonDataItem.GetId() === id) return addonDataItem } _SaveToJson() { const aData = this._addonData; return { "addonDataJson": aData ? aData._SaveToJson() : aData, "value": this._value, "aValue": this._aValue, "type": this._type, "time": this._time, "ease": this._ease, "enable": this._enable } } _LoadFromJson(o) { if (!o) return; if (o["addonDataJson"]) this._addonData._SetFromJson(o["addonDataJson"]); this._value = o["value"]; this._aValue = o["aValue"]; this._type = o["type"]; this._time = o["time"]; this._ease = o["ease"]; this._enable = o["enable"] } } C3.PropertyKeyframeData = class PropertyKeyframeData { constructor(propertyKeyframesDataJson, propertyTrackDataItem) { this._propertyTrackDataItem = propertyTrackDataItem; this._propertyKeyframeDataItems = []; C3.TimelineDataManager._CreateDataItems(this._propertyKeyframeDataItems, propertyKeyframesDataJson, PropertyKeyframeDataItem, this) } Release() { this._propertyTrackDataItem = null; for (const propertyKeyframeDataItem of this._propertyKeyframeDataItems) propertyKeyframeDataItem.Release(); C3.clearArray(this._propertyKeyframeDataItems); this._propertyKeyframeDataItems = null } AddEmptyPropertyKeyframeDataItem() { const propertyKeyframeDataItem = new PropertyKeyframeDataItem(null,this); this._propertyKeyframeDataItems.push(propertyKeyframeDataItem); return propertyKeyframeDataItem } DeletePropertyKeyframeDataItems(match) { for (const propertyKeyframeDataItem of this._propertyKeyframeDataItems) { if (!match(propertyKeyframeDataItem)) continue; const index = this._propertyKeyframeDataItems.indexOf(propertyKeyframeDataItem); if (index === -1) continue; propertyKeyframeDataItem.Release(); this._propertyKeyframeDataItems.splice(index, 1) } this.SortPropertyKeyFrameDataItems() } SortPropertyKeyFrameDataItems() { this._propertyKeyframeDataItems.sort((a,b)=>a.GetTime() - b.GetTime()) } GetPropertyTrackDataItem() { return this._propertyTrackDataItem } GetPropertyKeyframeDataItemCount() { return this._propertyKeyframeDataItems.length } GetPropertyKeyframeDataItemArray() { return this._propertyKeyframeDataItems } *propertyKeyframeDataItems() { for (const propertyKeyframeDataItem of this._propertyKeyframeDataItems) yield propertyKeyframeDataItem } *propertyKeyframeDataItemsReverse() { for (let i = this._propertyKeyframeDataItems.length - 1; i >= 0; i--) yield this._propertyKeyframeDataItems[i] } _SaveToJson() { return { "propertyKeyframeDataItemsJson": this._propertyKeyframeDataItems.map(propertyTrackDataItem=>propertyTrackDataItem._SaveToJson()) } } _LoadFromJson(o) { if (!o) return; C3.TimelineDataManager._LoadDataItemsFromJson(this._propertyKeyframeDataItems, o["propertyKeyframeDataItemsJson"], PropertyKeyframeDataItem, this) } } } ;'use strict'; { const C3 = self.C3; const ADDON_ID = 0; const ADDON_DATA = 1; class AddonDataItem { constructor(addonDataJson, addonData) { this._addonData = addonData; this._id = addonDataJson[ADDON_ID]; this._data = addonDataJson[ADDON_DATA] } Release() { this._addonData = null; this._data = null } GetAddonData() { return this._addonData } GetId() { return this._id } _SaveToJson() { return { "id": this._id, "data": this._data } } _LoadFromJson(o) { if (!o) return; this._id = o["id"]; this._data = o["data"] } } const START_ANCHOR = 0; const START_ENABLE = 1; const END_ANCHOR = 2; const END_ENABLE = 3; class AddonDataCubicBezierItem extends AddonDataItem { constructor(addonDataJson, addonData) { super(addonDataJson, addonData); this._startAnchor = this._data[START_ANCHOR]; this._startEnable = !!this._data[START_ENABLE]; this._endAnchor = this._data[END_ANCHOR]; this._endEnable = !!this._data[END_ENABLE] } Release() { super.Release() } GetStartAnchor() { return this._startAnchor } GetStartEnable() { return this._startEnable } GetEndAnchor() { return this._endAnchor } GetEndEnable() { return this._endEnable } _SaveToJson() { return Object.assign(super._SaveToJson(), { "startAnchor": this._startAnchor, "startEnable": !!this._startEnable, "endAnchor": this._endAnchor, "endEnable": !!this._endEnable }) } _LoadFromJson(o) { if (!o) return; super._LoadFromJson(o); this._startAnchor = o["startAnchor"]; this._startEnable = !!o["startEnable"]; this._endAnchor = o["endAnchor"]; this._endEnable = !!o["endEnable"] } } const DIRECTION = 0; const REVOLUTIONS = 1; class AddonDataAngleItem extends AddonDataItem { constructor(addonDataJson, addonData) { super(addonDataJson, addonData); this._direction = this._data[DIRECTION]; this._revolutions = this._data[REVOLUTIONS] } Release() { super.Release() } GetDirection() { return this._direction } GetRevolutions() { return this._revolutions } _SaveToJson() { return Object.assign(super._SaveToJson(), { "direction": this._direction, "revolutions": this._revolutions }) } _LoadFromJson(o) { if (!o) return; super._LoadFromJson(o); this._direction = o["direction"]; this._revolutions = o["revolutions"] } } C3.AddonData = class AddonData { constructor(addonsDataJson, propertyKeyframeDataItem) { this._propertyKeyframeDataItem = propertyKeyframeDataItem; this._addonDataItems = []; C3.TimelineDataManager._CreateDataItems(this._addonDataItems, addonsDataJson, { prop: 0, map: new Map([["cubic-bezier", AddonDataCubicBezierItem], ["angle", AddonDataAngleItem]]) }, this) } Release() { this._propertyKeyframeDataItem = null; for (const addonDataItem of this._addonDataItems) addonDataItem.Release(); C3.clearArray(this._addonDataItems); this._addonDataItems = null } GetPropertyKeyframeDataItem() { return this._propertyKeyframeDataItem } *addonDataItems() { for (const addonDataItem of this._addonDataItems) yield addonDataItem } _SaveToJson() { return { "addonDataItemsJson": this._addonDataItems.map(addonDataItem=>addonDataItem._SaveToJson()) } } _LoadFromJson(o) { if (!o) return; C3.TimelineDataManager._LoadDataItemsFromJson(this._addonDataItems, o["addonDataItemsJson"], { prop: "id", map: new Map([["cubic-bezier", AddonDataCubicBezierItem], ["angle", AddonDataAngleItem]]) }, this) } } } ;'use strict'; { const C3 = self.C3; const INITIAL_VALUE_MODE_START_VALUE = "start-value"; const INITIAL_VALUE_MODE_CURRENT_STATE = "current-state"; let createdTweens = 0; C3.Tween = class Tween extends C3.TimelineState { constructor(tweenDataItem, timelineManager) { super(`tween-${createdTweens++}`, tweenDataItem, timelineManager); this._id = ""; this._destroyInstanceOnComplete = false; this._initialValueMode = INITIAL_VALUE_MODE_START_VALUE; this._on_completed_callbacks = null; this._on_started_callbacks = null } GetInstance() { const tracks = this.GetTracks(); if (!tracks || !tracks.length) return; const track = tracks[0]; if (!track) return; const instance = track.GetInstance(); return track.IsInstanceValid() ? instance : null } AddStartedCallback(c) { if (!this._on_started_callbacks) this._on_started_callbacks = []; this._on_started_callbacks.push(c) } AddCompletedCallback(c) { if (!this._on_completed_callbacks) this._on_completed_callbacks = []; this._on_completed_callbacks.push(c) } RemoveStartedCallback(c) { if (!this._on_started_callbacks) return; const index = this._on_started_callbacks.indexOf(c); if (index !== -1) this._on_started_callbacks.splice(index, 1) } RemoveCompletedCallback(c) { if (!this._on_completed_callbacks) return; const index = this._on_completed_callbacks.indexOf(c); if (index !== -1) this._on_completed_callbacks.splice(index, 1) } SetStartValue(startValue, propertyName) { for (const track of this._tracks) for (const propertyTrack of track._propertyTracks) { if (propertyTrack.GetPropertyName() !== propertyName) continue; const propertyTrackData = propertyTrack.GetPropertyTrackData(); const propertyTrackDataItem = propertyTrack.GetPropertyTrackDataItem(); const propertyKeyframeDataItem = propertyTrackData.GetFirstPropertyKeyframeDataItem(propertyTrackDataItem); propertyKeyframeDataItem.SetValue(startValue); propertyKeyframeDataItem.SetAbsoluteValue(startValue) } } _GetPropertyTrackState(propertyName) { for (const track of this._tracks) for (const propertyTrack of track._propertyTracks) if (propertyTrack.GetPropertyName() === propertyName) return propertyTrack } BeforeSetEndValues(properties) { for (const propertyName of properties) { const propertyTrackState = this._GetPropertyTrackState(propertyName); this.SetStartValue(propertyTrackState.GetCurrentState(), propertyName) } if (this.IsForwardPlayBack()) { this.SetTotalTime(this.GetTotalTime() - this.GetTime()); this._SetTime(0) } else { this.SetTotalTime(this.GetTime()); this._SetTime(this.GetTotalTime()) } this.SetInitialStateFromSetTime() } SetEndValue(endValue, propertyName) { const propertyTrackState = this._GetPropertyTrackState(propertyName); const propertyTrackData = propertyTrackState.GetPropertyTrackData(); const propertyTrackDataItem = propertyTrackState.GetPropertyTrackDataItem(); const propertyKeyframeDataItem = propertyTrackData.GetLastPropertyKeyframeDataItem(propertyTrackDataItem); propertyKeyframeDataItem.SetTime(this.GetTotalTime()); propertyKeyframeDataItem.SetValue(endValue); propertyKeyframeDataItem.SetAbsoluteValue(endValue) } SetId(id) { this._id = id } GetId() { return this._id } SetInitialValueMode(initialValueMode) { this._initialValueMode = initialValueMode } GetInitialValueMode() { return this._initialValueMode } SetDestroyInstanceOnComplete(releaseOnComplete) { this._destroyInstanceOnComplete = releaseOnComplete } GetDestroyInstanceOnComplete() { return this._destroyInstanceOnComplete } OnStarted() { if (this._on_started_callbacks) for (const c of this._on_started_callbacks) c(this); if (this.IsComplete()) return; for (const track of this._tracks) track.CompareSaveStateWithCurrent() } OnCompleted() { this._completedTick = this._runtime.GetTickCount() } FinishTriggers() { if (this._finishedTriggers) return; this._finishedTriggers = true; if (this._on_completed_callbacks) for (const c of this._on_completed_callbacks) c(this) } SetTime(time) { this._DeleteIntermediateKeyframes(); super.SetTime(time) } SetInitialState(fromSetTime) { if (!this.InitialStateSet() && this.GetInitialValueMode() === INITIAL_VALUE_MODE_CURRENT_STATE) for (const track of this._tracks) track.CompareInitialStateWithCurrent(); super.SetInitialState(fromSetTime) } Stop(completed=false) { super.Stop(completed); if (this.IsComplete()) return; for (const track of this._tracks) track.SaveState() } Reset(render=true, beforeChangeLayout=false) { this._DeleteIntermediateKeyframes(); super.Reset(render, beforeChangeLayout) } _DeleteIntermediateKeyframes() { for (const track of this._tracks) { const del = kf=>{ const time = kf.GetTime(); const totalTime = this.GetTotalTime(); return time !== 0 && time !== totalTime } ; track.DeleteKeyframes(del); track.DeletePropertyKeyframes(del) } } _OnBeforeChangeLayout() { if (this.IsReleased()) return true; const instance = this.GetInstance(); if (instance && instance.GetObjectClass().IsGlobal()) return false; this._timelineManager.CompleteTimeline(this); this.ResetBeforeChangeLayout(); return true } MaybeTriggerKeyframeReachedConditions() {} Tick(deltaTime, timeScale) { const instance = this.GetInstance(); const dt = this.GetRuntime().GetDt(instance); super.Tick(dt, 1) } _SaveToJson() { const ret = super._SaveToJson(); const tweenDataItem = this.GetTimelineDataItem(); return Object.assign(ret, { "tweenDataItemJson": tweenDataItem._SaveToJson(), "id": this._id, "destroyInstanceOnComplete": this._destroyInstanceOnComplete, "initialValueMode": this._initialValueMode }) } _LoadFromJson(o) { if (!o) return; const tweenDataItem = this.GetTimelineDataItem(); tweenDataItem._LoadFromJson(o["tweenDataItemJson"]); super._LoadFromJson(o); this._id = o["id"]; this._destroyInstanceOnComplete = o["destroyInstanceOnComplete"]; this._initialValueMode = o["initialValueMode"] } static IsPlaying(tween) { return tween.IsPlaying() } static IsPaused(tween) { return tween.IsPaused() } static Build(config) { const timelineManager = config.runtime.GetTimelineManager(); const tweenDataItem = new C3.TimelineDataItem; if (config.json) { tweenDataItem._LoadFromJson(config.json["tweenDataItemJson"]); const tween = new C3.Tween(tweenDataItem,timelineManager); tween._LoadFromJson(config.json); return tween } else { const tween = new C3.Tween(tweenDataItem,timelineManager); if (!C3.IsArray(config.propertyTracksConfig)) config.propertyTracksConfig = [config.propertyTracksConfig]; tween.SetId(config.id); tween.SetTags(config.tags); tween.SetInitialValueMode(config.initialValueMode); tween.SetDestroyInstanceOnComplete(config.releaseOnComplete); tween.SetLoop(config.loop); tween.SetPingPong(config.pingPong); tween.SetTotalTime(config.time); tween.SetStep(0); tween.SetInterpolationMode("default"); tween.SetResultMode(config.propertyTracksConfig[0].resultMode); const track = tween.AddTrack(); track.SetInstanceUID(config.instance.GetUID()); track.SetInterpolationMode("default"); track.SetResultMode(config.propertyTracksConfig[0].resultMode); track.SetEnable(true); track.SetObjectClassIndex(config.instance.GetObjectClass().GetIndex()); track.SetOriginalWidth(config.instance.GetWorldInfo().GetWidth()); track.SetOriginalHeight(config.instance.GetWorldInfo().GetHeight()); const startKeyframeDataItem = track.AddKeyframe(); startKeyframeDataItem.SetTime(0); startKeyframeDataItem.SetEase("noease"); startKeyframeDataItem.SetEnable(true); startKeyframeDataItem.SetTags(""); const endKeyframeDataItem = track.AddKeyframe(); endKeyframeDataItem.SetTime(config.time); endKeyframeDataItem.SetEase("noease"); endKeyframeDataItem.SetEnable(true); endKeyframeDataItem.SetTags(""); for (const propertyTrackConfig of config.propertyTracksConfig) { const propertyTrack = track.AddPropertyTrack(); propertyTrack.SetSourceAdapterId(propertyTrackConfig.sourceId); propertyTrack.SetSourceAdapterArgs(propertyTrackConfig.sourceArgs); propertyTrack.SetPropertyName(propertyTrackConfig.property); propertyTrack.SetPropertyType(propertyTrackConfig.type); propertyTrack.SetMin(NaN); propertyTrack.SetMax(NaN); propertyTrack.SetInterpolationMode("default"); propertyTrack.SetResultMode(propertyTrackConfig.resultMode); propertyTrack.SetEnable(true); const startPropertyKeyframeDataItem = propertyTrack.AddPropertyKeyframe(); startPropertyKeyframeDataItem.SetType(propertyTrackConfig.valueType); startPropertyKeyframeDataItem.SetTime(0); startPropertyKeyframeDataItem.SetEase(propertyTrackConfig.ease); startPropertyKeyframeDataItem.SetEnable(true); startPropertyKeyframeDataItem.SetValue(propertyTrackConfig.startValue); startPropertyKeyframeDataItem.SetAbsoluteValue(propertyTrackConfig.startValue); const endPropertyKeyframeDataItem = propertyTrack.AddPropertyKeyframe(); endPropertyKeyframeDataItem.SetType(propertyTrackConfig.valueType); endPropertyKeyframeDataItem.SetTime(config.time); endPropertyKeyframeDataItem.SetEase(propertyTrackConfig.ease); endPropertyKeyframeDataItem.SetEnable(true); endPropertyKeyframeDataItem.SetValue(propertyTrackConfig.endValue); endPropertyKeyframeDataItem.SetAbsoluteValue(propertyTrackConfig.endValue) } return tween } } } } ;'use strict'; { const C3 = self.C3; const Ease = self.Ease; const NAME = 0; const TRANSITION_KEYFRAMES = 1; C3.Transition = class Transition extends C3.DefendedBase { constructor(data) { super(); this._name = data[NAME]; this._transitionKeyframes = []; for (const transitionKeyframeData of data[TRANSITION_KEYFRAMES]) { const transitionKeyframe = C3.TransitionKeyframe.Create(this, transitionKeyframeData); this._transitionKeyframes.push(transitionKeyframe) } this._precalculatedSamples = new Map; this._transitionKeyframeCache = new Map; this._PreCalcSamples(); Ease.AddCustomEase(this._name, (t,sv,dv,tt)=>this.Interpolate(t, sv, dv, tt)) } static Create(data) { return C3.New(C3.Transition, data) } Release() { for (const transitionKeyframe of this._transitionKeyframes) transitionKeyframe.Release(); C3.clearArray(this._transitionKeyframes); this._transitionKeyframes = null; this._precalculatedSamples.clear(); this._precalculatedSamples = null; this._transitionKeyframeCache.clear(); this._transitionKeyframeCache = null } GetTransitionKeyFrameAt(x) { const transitionKeyframe = this._transitionKeyframeCache.get(x); if (transitionKeyframe) return transitionKeyframe; for (const transitionKeyframe of this._transitionKeyframes) if (transitionKeyframe.GetValueX() === x) { this._transitionKeyframeCache.set(x, transitionKeyframe); return transitionKeyframe } } GetFirstTransitionKeyFrameHigherThan(x) { for (const transitionKeyframe of this._transitionKeyframes) if (transitionKeyframe.GetValueX() > x) return transitionKeyframe } GetFirstTransitionKeyFrameHigherOrEqualThan(x) { for (const transitionKeyframe of this._transitionKeyframes) if (transitionKeyframe.GetValueX() >= x) return transitionKeyframe } GetFirstTransitionKeyFrameLowerOrEqualThan(x) { for (let i = this._transitionKeyframes.length - 1; i >= 0; i--) { const transitionKeyframe = this._transitionKeyframes[i]; if (transitionKeyframe.GetValueX() <= x) return transitionKeyframe } } Interpolate(time, startValue, deltaValue, totalTime) { const n = time / totalTime; let start = this.GetTransitionKeyFrameAt(n); let end = null; if (start) end = this.GetFirstTransitionKeyFrameHigherThan(n); else { start = this.GetFirstTransitionKeyFrameLowerOrEqualThan(n); end = this.GetFirstTransitionKeyFrameHigherOrEqualThan(n) } const delta = end.GetValueX() - start.GetValueX(); const nn = C3.mapToRange(n, start.GetValueX(), end.GetValueX(), 0, delta); const startX = start.GetValueX(); const startY = start.GetValueY(); const anchor1X = start.GetValueX() + start.GetStartAnchorX(); const anchor1Y = start.GetValueY() + start.GetStartAnchorY(); const anchor2X = end.GetValueX() + end.GetEndAnchorX(); const anchor2Y = end.GetValueY() + end.GetEndAnchorY(); const endX = end.GetValueX(); const endY = end.GetValueY(); let ret = Ease.GetRuntimeEase("spline")(nn, startX, startY, anchor1X, anchor1Y, anchor2X, anchor2Y, endX, endY, this._precalculatedSamples.get(start)); ret += start.GetValueY(); return (1 - ret) * startValue + ret * (startValue + deltaValue) } _PreCalcSamples() { this._precalculatedSamples.clear(); for (let i = 0; i < this._transitionKeyframes.length - 1; i++) { const transitionKeyframe = this._transitionKeyframes[i]; if (!transitionKeyframe.GetStartEnable()) continue; const start = transitionKeyframe; const end = this._transitionKeyframes[i + 1]; const startValue = start.GetValueX(); const anchor1Value = start.GetValueX() + start.GetStartAnchorX(); const anchor2Value = end.GetValueX() + end.GetEndAnchorX(); const endValue = end.GetValueX(); this._precalculatedSamples.set(start, Ease.GetBezierSamples(startValue, anchor1Value, anchor2Value, endValue)) } } } } ;'use strict'; { const C3 = self.C3; const VALUE_X = 0; const VALUE_Y = 1; const START_ANCHOR_X = 2; const START_ANCHOR_Y = 3; const END_ANCHOR_X = 4; const END_ANCHOR_Y = 5; const START_ENABLE = 6; const END_ENABLE = 7; C3.TransitionKeyframe = class TransitionKeyframe extends C3.DefendedBase { constructor(transition, data) { super(); this._transition = transition; this._valueX = data[VALUE_X]; this._valueY = data[VALUE_Y]; this._startAnchorX = data[START_ANCHOR_X]; this._startAnchorY = data[START_ANCHOR_Y]; this._endAnchorX = data[END_ANCHOR_X]; this._endAnchorY = data[END_ANCHOR_Y]; this._startEnable = data[START_ENABLE]; this._endEnable = data[END_ENABLE] } Release() { this._transition = null } static Create(transition, data) { return C3.New(C3.TransitionKeyframe, transition, data) } GetValueX() { return this._valueX } GetValueY() { return this._valueY } GetStartAnchorX() { return this._startAnchorX } GetStartAnchorY() { return this._startAnchorY } GetEndAnchorX() { return this._endAnchorX } GetEndAnchorY() { return this._endAnchorY } GetStartEnable() { return this._startEnable } GetEndEnable() { return this._endEnable } } } ;'use strict'; { const C3 = self.C3; C3.TransitionManager = class TransitionManager extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._transitions = [] } Release() { for (const transition of this._transitions) transition.Release(); C3.clearArray(this._transitions); this._transitions = null } Create(transitionData) { this._transitions.push(C3.Transition.Create(transitionData)) } } } ;'use strict'; { const C3 = self.C3; C3.SolStack = class SolStack extends C3.DefendedBase { constructor(objectClass) { super(); this._objectClass = objectClass; this._stack = []; this._stack.push(C3.New(C3.Sol, this)); this._index = 0; this._current = this._stack[0] } Release() { for (const s of this._stack) s.Release(); C3.clearArray(this._stack); this._current = null; this._objectClass = null } GetObjectClass() { return this._objectClass } GetCurrentSol() { return this._current } Clear() { this.GetCurrentSol().Clear() } PushClean() { const stack = this._stack; const index = ++this._index; if (index === stack.length) { const sol = C3.New(C3.Sol, this); stack.push(sol); this._current = sol } else { const sol = stack[index]; sol.Reset(); this._current = sol } } PushCopy() { const stack = this._stack; const index = ++this._index; if (index === stack.length) stack.push(C3.New(C3.Sol, this)); const sol = stack[index]; sol.Copy(stack[index - 1]); this._current = sol } Pop() { this._current = this._stack[--this._index] } RemoveInstances(s) { const stack = this._stack; for (let i = 0, len = stack.length; i < len; ++i) stack[i].RemoveInstances(s) } } } ;'use strict'; { const C3 = self.C3; C3.Sol = class Sol extends C3.DefendedBase { constructor(stack) { super(); this._stack = stack; this._objectClass = this._stack.GetObjectClass(); this._eventStack = this._objectClass.GetRuntime().GetEventStack(); this._selectAll = true; this._instances = []; this._elseInstances = [] } Release() { this.ClearArrays(); this._stack = null; this._objectClass = null; this._eventStack = null } ClearArrays() { C3.clearArray(this._instances); C3.clearArray(this._elseInstances) } GetObjectClass() { return this._objectClass } IsSelectAll() { return this._selectAll } HasAnyInstances() { if (this._selectAll) return !!this._objectClass.GetInstanceCount(); else return !!this._instances.length } GetInstances() { if (this._selectAll) return this._objectClass.GetInstances(); else return this._instances } HasAnyElseInstances() { return !!this._elseInstances.length } GetElseInstances() { return this._elseInstances } GetExpressionInstances() { const ret = this.GetInstances(); if (ret.length) return ret; else return this._elseInstances } Reset() { this._selectAll = true; C3.clearArray(this._elseInstances) } Clear() { this._selectAll = true } Copy(sol) { if (sol.IsSelectAll()) this.Reset(); else { this._selectAll = false; C3.shallowAssignArray(this._instances, sol._instances); C3.clearArray(this._elseInstances) } } _PushInstance(inst) { this._instances.push(inst) } _PushElseInstance(inst) { this._elseInstances.push(inst) } _SetSelectAll(s) { this._selectAll = !!s } _GetOwnInstances() { return this._instances } _GetOwnElseInstances() { return this._elseInstances } SetSinglePicked(inst) { this._selectAll = false; C3.clearArray(this._instances); this._instances.push(inst) } SetArrayPicked(arr) { this._selectAll = false; C3.shallowAssignArray(this._instances, arr) } SetSetPicked(set) { this._selectAll = false; C3.clearArray(this._instances); for (const item of set) this._instances.push(item) } AddElseInstances(setOfPicked, arrayOfAllPicked) { for (const inst of arrayOfAllPicked) if (!setOfPicked.has(inst)) this._elseInstances.push(inst) } TransferElseInstancesToOwn(setOfPicked) { for (const inst of setOfPicked) this._instances.push(inst); C3.arrayRemoveAllInSet(this._elseInstances, setOfPicked) } PickOne(inst) { if (!inst) return; if (this._eventStack.GetCurrentStackFrame().GetCurrentEvent().IsOrBlock()) { if (this.IsSelectAll()) { C3.clearArray(this._instances); C3.shallowAssignArray(this._elseInstances, inst.GetObjectClass().GetInstances()); this._selectAll = false } const i = this._elseInstances.indexOf(inst); if (i !== -1) { this._instances.push(this._elseInstances[i]); this._elseInstances.splice(i, 1) } } else this.SetSinglePicked(inst) } RemoveInstances(s) { C3.arrayRemoveAllInSet(this._instances, s); C3.arrayRemoveAllInSet(this._elseInstances, s) } } } ;'use strict'; { const C3 = self.C3; C3.EventStack = class EventStack extends C3.DefendedBase { constructor(eventSheetManager) { super(); this._eventSheetManager = eventSheetManager; this._runtime = this._eventSheetManager.GetRuntime(); this._stack = []; this._stack.push(C3.New(C3.EventStackFrame, this, null)); this._index = 0; this._expFuncStack = [] } Release() { for (const e of this._stack) e.Release(); C3.clearArray(this._stack); C3.clearArray(this._expFuncStack); this._eventSheetManager = null; this._runtime = null } GetEventSheetManager() { return this._eventSheetManager } GetRuntime() { return this._runtime } GetCurrentStackFrame() { return this._stack[this._index] } Push(currentEvent) { const stack = this._stack; const index = ++this._index; if (index === stack.length) { const ret = C3.New(C3.EventStackFrame, this, currentEvent); stack.push(ret); return ret } else { const ret = stack[index]; ret.Reset(currentEvent); return ret } } Pop() { --this._index } PushExpFunc(frame) { this._expFuncStack.push(frame) } PopExpFunc() { this._expFuncStack.pop() } GetCurrentExpFuncStackFrame() { const expFuncStack = this._expFuncStack; if (expFuncStack.length === 0) return null; else return expFuncStack[expFuncStack.length - 1] } } } ;'use strict'; { const C3 = self.C3; C3.EventStackFrame = class EventStackFrame extends C3.DefendedBase { constructor(stack, currentEvent) { super(); this._stack = stack; this._runtime = this._stack.GetRuntime(); this._currentEvent = currentEvent; this._cndIndex = 0; this._actIndex = 0; this._lastEventTrue = false; this._elseBranchRan = false; this._expressionObjectClass = null; this._functionReturnType = 0; this._functionReturnValue = 0 } Release() { this.Reset(null); this._stack = null; this._runtime = null } Reset(currentEvent) { this._currentEvent = currentEvent; this._cndIndex = 0; this._actIndex = 0; this._lastEventTrue = false; this._elseBranchRan = false } _Restore(currentEvent, actIndex) { this._currentEvent = currentEvent; this._cndIndex = 0; this._actIndex = actIndex } ResetQuick() { this._cndIndex = 0; this._actIndex = 0 } GetCurrentEvent() { return this._currentEvent } SetCurrentEvent(currentEvent) { this._currentEvent = currentEvent } GetConditionIndex() { return this._cndIndex } SetConditionIndex(i) { this._cndIndex = i } GetActionIndex() { return this._actIndex } SetActionIndex(i) { this._actIndex = i } SetLastEventTrue(t) { this._lastEventTrue = !!t } GetLastEventTrue() { return this._lastEventTrue } SetElseBranchRan(r) { this._elseBranchRan = !!r } GetElseBranchRan() { return this._elseBranchRan } SetExpressionObjectClass(objectClass) { this._expressionObjectClass = objectClass } GetExpressionObjectClass() { return this._expressionObjectClass } InitCallFunctionExpression(returnType, defaultReturnValue) { this._functionReturnType = returnType; this._functionReturnValue = defaultReturnValue } GetFunctionReturnType() { return this._functionReturnType } SetFunctionReturnValue(v) { this._functionReturnValue = v } GetFunctionReturnValue() { return this._functionReturnValue } IsSolModifierAfterCnds() { const currentEvent = this._currentEvent; if (currentEvent.IsSolWriterAfterCnds()) return true; if (this._cndIndex < currentEvent.GetConditionCount() - 1) return !!currentEvent.GetSolModifiers().length; return false } } } ;'use strict'; { const C3 = self.C3; C3.LocalVarStack = class LocalVarStack extends C3.DefendedBase { constructor(eventSheetManager) { super(); this._eventSheetManager = eventSheetManager; this._runtime = this._eventSheetManager.GetRuntime(); this._stack = []; this._index = -1; this._current = null; this._initialValues = [] } Release() { C3.clearArray(this._stack); this._eventSheetManager = null; this._runtime = null } _SetInitialValues(initialValues) { this._initialValues = initialValues; const arr = this._initialValues.slice(0); this._stack.push(arr); this._index = 0; this._current = arr } GetEventSheetManager() { return this._eventSheetManager } GetRuntime() { return this._runtime } GetCurrent() { return this._current } Push() { const index = ++this._index; const stack = this._stack; if (index === stack.length) stack.push(this._initialValues.slice(0)); else C3.shallowAssignArray(stack[index], this._initialValues); this._current = stack[index] } Pop() { this._current = this._stack[--this._index] } } } ;'use strict'; { const C3 = self.C3; C3.LoopStack = class LoopStack extends C3.DefendedBase { constructor(eventSheetManager) { super(); this._eventSheetManager = eventSheetManager; this._runtime = this._eventSheetManager.GetRuntime(); this._stack = []; this._index = -1 } Release() { C3.clearArray(this._stack); this._eventSheetManager = null; this._runtime = null } GetEventSheetManager() { return this._eventSheetManager } GetRuntime() { return this._runtime } IsInLoop() { return this._index >= 0 } GetCurrent() { return this._stack[this._index] } Push() { ++this._index; if (this._index === this._stack.length) { const ret = C3.New(C3.Loop, this); this._stack.push(ret); return ret } else { const ret = this._stack[this._index]; ret.Reset(); return ret } } Pop() { --this._index } FindByName(name) { const stack = this._stack; for (let i = this._index; i >= 0; --i) { const loop = stack[i]; if (loop.GetName() === name) return loop } return null } _GetStack() { return this._stack.slice(0, this._index + 1) } } } ;'use strict'; { const C3 = self.C3; C3.Loop = class Loop extends C3.DefendedBase { constructor(loopStack) { super(); this._loopStack = loopStack; this._name = ""; this._index = 0; this._isStopped = false; this._end = NaN } Reset() { this._name = ""; this._index = 0; this._isStopped = false; this._end = NaN } SetName(name) { this._name = name } GetName() { return this._name } SetIndex(i) { this._index = i } GetIndex() { return this._index } Stop() { this._isStopped = true } IsStopped() { return this._isStopped } SetEnd(e) { this._end = e } GetEnd() { return this._end } } } ;'use strict'; { const C3 = self.C3; C3.ArrayStack = class ArrayStack extends C3.DefendedBase { constructor() { super(); this._stack = []; this._index = -1 } Release() { C3.clearArray(this._stack) } GetCurrent() { return this._stack[this._index] } Push() { ++this._index; if (this._index === this._stack.length) { const ret = []; this._stack.push(ret); return ret } else return this._stack[this._index] } Pop() { --this._index } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; function SortSolArray(a, b) { return a.GetIndex() - b.GetIndex() } function IsSolArrayIdentical(a, b) { for (let i = 0, len = a.length; i < len; ++i) if (a[i] !== b[i]) return false; return true } C3.EventSheetManager = class EventSheetManager extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._allSheets = []; this._sheetsByName = new Map; this._allGroups = []; this._groupsByName = new Map; this._blocksBySid = new Map; this._cndsBySid = new Map; this._actsBySid = new Map; this._allUniqueSolModifiers = new Map; this._eventVarsBySid = new Map; this._nextLocalVarIndex = 0; this._allGlobalVars = []; this._allLocalVars = []; this._localVarInitialValues = []; this._functionBlocksByName = new Map; this._eventStack = C3.New(C3.EventStack, this); this._localVarStack = C3.New(C3.LocalVarStack, this); this._loopStack = C3.New(C3.LoopStack, this); this._triggersToPostInit = []; this._queuedTriggers = []; this._queuedDebugTriggers = []; this._runningEventsDepth = 0; this._executingTriggerDepth = 0; this._blockFlushingDepth = 0; this._scheduledWaits = []; this._asyncActionPromises = []; self["c3_callFunction"] = (name,params)=>this._InvokeFunctionFromJS(name, params) } Release() { this.ClearAllScheduledWaits(); this._eventStack.Release(); this._eventStack = null; this._localVarStack.Release(); this._localVarStack = null; C3.clearArray(this._queuedTriggers); C3.clearArray(this._queuedDebugTriggers); this._runtime = null; C3.clearArray(this._allSheets); this._sheetsByName.clear() } Create(eventSheetData) { const eventSheet = C3.New(C3.EventSheet, this, eventSheetData); this._allSheets.push(eventSheet); this._sheetsByName.set(eventSheet.GetName().toLowerCase(), eventSheet) } _AddTriggerToPostInit(trig) { this._triggersToPostInit.push(trig) } _PostInit() { for (const functionBlock of this._functionBlocksByName.values()) functionBlock._PostInit(false); for (const sheet of this._allSheets) sheet._PostInit(); for (const sheet of this._allSheets) sheet._UpdateDeepIncludes(); for (const trig of this._triggersToPostInit) trig._PostInit(false); C3.clearArray(this._triggersToPostInit); this._localVarStack._SetInitialValues(this._localVarInitialValues) } GetRuntime() { return this._runtime } GetEventSheetByName(name) { return this._sheetsByName.get(name.toLowerCase()) || null } _RegisterGroup(group) { this._allGroups.push(group); this._groupsByName.set(group.GetGroupName(), group) } _RegisterEventBlock(eventBlock) { this._blocksBySid.set(eventBlock.GetSID(), eventBlock) } _RegisterCondition(condition) { this._cndsBySid.set(condition.GetSID(), condition) } _RegisterAction(action) { this._actsBySid.set(action.GetSID(), action) } _RegisterFunctionBlock(functionBlock) { this._functionBlocksByName.set(functionBlock.GetFunctionName().toLowerCase(), functionBlock) } _RegisterEventVariable(ev) { this._eventVarsBySid.set(ev.GetSID(), ev); if (ev.IsGlobal()) this._allGlobalVars.push(ev); else this._allLocalVars.push(ev) } _DeduplicateSolModifierList(arr) { if (arr.length >= 2) arr.sort(SortSolArray); let candidateList = this._allUniqueSolModifiers.get(arr.length); if (!candidateList) { candidateList = []; this._allUniqueSolModifiers.set(arr.length, candidateList) } for (let i = 0, len = candidateList.length; i < len; ++i) { const candidate = candidateList[i]; if (IsSolArrayIdentical(arr, candidate)) return candidate } candidateList.push(arr); return arr } _GetNextLocalVarIndex(eventVar) { this._localVarInitialValues.push(eventVar.GetInitialValue()); return this._nextLocalVarIndex++ } GetEventStack() { return this._eventStack } GetCurrentEventStackFrame() { return this.GetEventStack().GetCurrentStackFrame() } GetCurrentEvent() { return this.GetCurrentEventStackFrame().GetCurrentEvent() } GetCurrentCondition() { const frame = this.GetCurrentEventStackFrame(); const event = frame.GetCurrentEvent(); return event.GetConditionAt(frame.GetConditionIndex()) } GetCurrentAction() { const frame = this.GetCurrentEventStackFrame(); const event = frame.GetCurrentEvent(); return event.GetActionAt(frame.GetActionIndex()) } GetLocalVarStack() { return this._localVarStack } GetLoopStack() { return this._loopStack } GetAllLocalVariablesInScope(fromRow) { const ret = []; fromRow = fromRow.GetScopeParent(); while (fromRow) { C3.appendArray(ret, fromRow._GetAllLocalVariablesInScope()); fromRow = fromRow.GetScopeParent() } return ret } _GetLocalVariablesScriptInterface(fromRow) { const localVarDescriptors = {}; for (const v of this.GetAllLocalVariablesInScope(fromRow)) localVarDescriptors[v.GetJsPropName()] = v._GetScriptInterfaceDescriptor(); return Object.create(Object.prototype, localVarDescriptors) } GetEventVariableBySID(sid) { return this._eventVarsBySid.get(sid) || null } GetEventBlockBySID(sid) { return this._blocksBySid.get(sid) || null } GetConditionBySID(sid) { return this._cndsBySid.get(sid) || null } GetActionBySID(sid) { return this._actsBySid.get(sid) || null } GetFunctionBlockByName(name) { return this._functionBlocksByName.get(name.toLowerCase()) || null } GetAllGlobalVariables() { return this._allGlobalVars } GetAllLocalVariables() { return this._allLocalVars } ResetAllGlobalsToInitialValue() { for (const ev of this._allGlobalVars) ev.ResetToInitialValue() } GetEventGroupByName(name) { return this._groupsByName.get(name.toLowerCase()) || null } GetEventGroupBySID(sid) { const group = this._blocksBySid.get(sid); if (group && group.IsGroup()) return group; else return null } GetAllGroups() { return this._allGroups } ResetAllGroupsInitialActivation() { for (const group of this._allGroups) group.ResetInitialActivation() } _ResetAllHasRunFlags() { for (const sheet of this._allSheets) sheet._ResetHasRunFlag() } RunEvents(layoutManager) { this._ResetAllHasRunFlags(); this._runningEventsDepth++; for (const layout of layoutManager.runningLayouts()) { const eventSheet = layout.GetEventSheet(); if (!eventSheet) continue; this._runtime.PushCurrentLayout(layout); eventSheet.Run(); this._runtime.PopCurrentLayout() } this._runningEventsDepth-- } async DebugRunEvents(layoutManager) { this._ResetAllHasRunFlags(); this._runningEventsDepth++; for (const breakEventObject of this._DebugRunEventsGen(layoutManager)) await this._runtime.DebugBreak(breakEventObject); this._runningEventsDepth-- } *_DebugRunEventsGen(layoutManager) { for (const layout of layoutManager.runningLayouts()) { const eventSheet = layout.GetEventSheet(); if (!eventSheet) continue; this._runtime.PushCurrentLayout(layout); yield*eventSheet.DebugRun(); this._runtime.PopCurrentLayout() } } _Trigger(layoutManager, method, inst, behaviorType) { let ret = false; if (!layoutManager.GetMainRunningLayout()) return this.QueueTrigger(method, inst, behaviorType); this._executingTriggerDepth++; for (const layout of layoutManager.runningLayouts()) { const eventSheet = layout.GetEventSheet(); if (!eventSheet) continue; this._runtime.PushCurrentLayout(layout); for (const includeSheet of eventSheet.deepIncludes()) { const result = includeSheet._Trigger(method, inst, behaviorType); ret = ret || result } const result2 = eventSheet._Trigger(method, inst, behaviorType); ret = ret || result2; this._runtime.PopCurrentLayout() } this._executingTriggerDepth--; return ret } *_DebugTrigger(layoutManager, method, inst, behaviorType) { let ret = false; if (!layoutManager.GetMainRunningLayout()) return this.QueueTrigger(method, inst, behaviorType); this._executingTriggerDepth++; for (const layout of layoutManager.runningLayouts()) { const eventSheet = layout.GetEventSheet(); if (!eventSheet) continue; this._runtime.PushCurrentLayout(layout); for (const includeSheet of eventSheet.deepIncludes()) { const result = yield*includeSheet._DebugTrigger(method, inst, behaviorType); ret = ret || result } const result2 = yield*eventSheet._DebugTrigger(method, inst, behaviorType); ret = ret || result2; this._runtime.PopCurrentLayout() } this._executingTriggerDepth--; return ret } QueueTrigger(method, inst, behaviorType) { this._queuedTriggers.push([method, inst, behaviorType]); return false } QueueDebugTrigger(method, inst, behaviorType) { let resolve = null; const ret = new Promise(r=>resolve = r); this._queuedDebugTriggers.push([method, inst, behaviorType, resolve]); return ret } *_RunQueuedDebugTriggersGen() { if (this._runtime.HitBreakpoint()) throw new Error("should not be in breakpoint"); const layoutManager = this._runtime.GetLayoutManager(); while (this._queuedDebugTriggers.length) { const [method,inst,behaviorType,resolve] = this._queuedDebugTriggers.shift(); const ret = yield*this._DebugTrigger(layoutManager, method, inst, behaviorType); resolve(ret) } } async RunQueuedDebugTriggersAsync() { for (const breakEventObject of this._RunQueuedDebugTriggersGen()) await this._runtime.DebugBreak(breakEventObject) } _FastTrigger(layoutManager, method, inst, value) { let ret = false; const layout = layoutManager.GetMainRunningLayout(); const eventSheet = layout.GetEventSheet(); if (!eventSheet) return; this._executingTriggerDepth++; this._runtime.PushCurrentLayout(layout); const deepIncludes = eventSheet.deepIncludes(); for (let i = 0, len = deepIncludes.length; i < len; ++i) { const result = deepIncludes[i]._FastTrigger(method, inst, value); ret = ret || result } const result2 = eventSheet._FastTrigger(method, inst, value); ret = ret || result2; this._runtime.PopCurrentLayout(); this._executingTriggerDepth--; return ret } *_DebugFastTrigger(layoutManager, method, inst, value) { let ret = false; const layout = layoutManager.GetMainRunningLayout(); const eventSheet = layout.GetEventSheet(); if (!eventSheet) return; this._executingTriggerDepth++; this._runtime.PushCurrentLayout(layout); const deepIncludes = eventSheet.deepIncludes(); for (let i = 0, len = deepIncludes.length; i < len; ++i) { const result = yield*deepIncludes[i]._DebugFastTrigger(method, inst, value); ret = ret || result } const result2 = yield*eventSheet._DebugFastTrigger(method, inst, value); ret = ret || result2; this._runtime.PopCurrentLayout(); this._executingTriggerDepth--; return ret } GetTriggerDepth() { return this._executingTriggerDepth } IsInTrigger() { return this.GetTriggerDepth() > 0 } _IncTriggerDepth() { return ++this._executingTriggerDepth } _DecTriggerDepth() { --this._executingTriggerDepth } IsRunningEvents() { return this._runningEventsDepth > 0 } IsInEventEngine() { return this.IsRunningEvents() || this.IsInTrigger() } _RunQueuedTriggers(layoutManager) { for (const [method,inst,behaviorType] of this._queuedTriggers) this._Trigger(layoutManager, method, inst, behaviorType); C3.clearArray(this._queuedTriggers) } BlockFlushingInstances(e) { if (e) this._blockFlushingDepth++; else this._blockFlushingDepth-- } IsFlushingBlocked() { return this._blockFlushingDepth > 0 } ClearSol(solModifiers) { for (let i = 0, len = solModifiers.length; i < len; ++i) solModifiers[i].GetSolStack().Clear() } PushCleanSol(solModifiers) { for (let i = 0, len = solModifiers.length; i < len; ++i) solModifiers[i].GetSolStack().PushClean() } PushCopySol(solModifiers) { for (let i = 0, len = solModifiers.length; i < len; ++i) solModifiers[i].GetSolStack().PushCopy() } PopSol(solModifiers) { for (let i = 0, len = solModifiers.length; i < len; ++i) solModifiers[i].GetSolStack().Pop() } AddScheduledWait() { const w = C3.New(C3.ScheduledWait, this); this._scheduledWaits.push(w); return w } scheduledWaits() { return this._scheduledWaits } RunScheduledWaits() { if (!this._scheduledWaits.length) return; const frame = this.GetCurrentEventStackFrame(); let didAnyRun = false; this._runningEventsDepth++; for (let i = 0, len = this._scheduledWaits.length; i < len; ++i) { const w = this._scheduledWaits[i]; if (w._ShouldRun()) w._Run(frame); if (w.ShouldRelease()) didAnyRun = true } if (didAnyRun) this._FilterScheduledWaitsToRelease(); this._runningEventsDepth-- } async DebugRunScheduledWaits() { if (!this._scheduledWaits.length) return; const frame = this.GetCurrentEventStackFrame(); let didAnyRun = false; this._runningEventsDepth++; for (let i = 0, len = this._scheduledWaits.length; i < len; ++i) { const w = this._scheduledWaits[i]; if (w._ShouldRun()) await w._DebugRun(frame); if (w.ShouldRelease()) didAnyRun = true } if (didAnyRun) this._FilterScheduledWaitsToRelease(); this._runningEventsDepth-- } _FilterScheduledWaitsToRelease() { const toRelease = C3.arrayFilterOut(this._scheduledWaits, w=>w.ShouldRelease()); for (const w of toRelease) w.Release() } ClearAllScheduledWaits() { for (const w of this._scheduledWaits) w.Release(); C3.clearArray(this._scheduledWaits) } RemoveInstancesFromScheduledWaits(s) { for (const w of this._scheduledWaits) w.RemoveInstances(s) } AddAsyncActionPromise(p) { this._asyncActionPromises.push(p) } ClearAsyncActionPromises() { C3.clearArray(this._asyncActionPromises) } GetPromiseForAllAsyncActions() { const ret = Promise.all(this._asyncActionPromises); this._asyncActionPromises = []; return ret } _SaveToJson() { return { "groups": this._SaveGroupsToJson(), "cnds": this._SaveCndsToJson(), "acts": this._SaveActsToJson(), "vars": this._SaveVarsToJson(), "waits": this._SaveScheduledWaitsToJson() } } _LoadFromJson(o) { this._LoadGroupsFromJson(o["groups"]); this._LoadCndsFromJson(o["cnds"]); this._LoadActsFromJson(o["acts"]); this._LoadVarsFromJson(o["vars"]); this._LoadScheduledWaitsFromJson(o["waits"]) } _SaveGroupsToJson() { const o = {}; for (const group of this.GetAllGroups()) o[group.GetSID().toString()] = group.IsGroupActive(); return o } _LoadGroupsFromJson(o) { for (const [sidStr,data] of Object.entries(o)) { const sid = parseInt(sidStr, 10); const group = this.GetEventGroupBySID(sid); if (group) group.SetGroupActive(data) } } _SaveCndsToJson() { const o = {}; for (const [sid,cnd] of this._cndsBySid) { const data = cnd._SaveToJson(); if (data) o[sid.toString()] = data } return o } _LoadCndsFromJson(o) { const map = new Map; for (const [sidStr,data] of Object.entries(o)) map.set(parseInt(sidStr, 10), data); for (const [sid,cnd] of this._cndsBySid) cnd._LoadFromJson(map.get(sid) || null) } _SaveActsToJson() { const o = {}; for (const [sid,act] of this._actsBySid) { const data = act._SaveToJson(); if (data) o[sid.toString()] = data } return o } _LoadActsFromJson(o) { const map = new Map; for (const [sidStr,data] of Object.entries(o)) map.set(parseInt(sidStr, 10), data); for (const [sid,act] of this._actsBySid) act._LoadFromJson(map.get(sid) || null) } _SaveVarsToJson() { const o = {}; for (const [sid,eventVar] of this._eventVarsBySid) if (!eventVar.IsConstant() && (eventVar.IsGlobal() || eventVar.IsStatic())) o[sid.toString()] = eventVar.GetValue(); return o } _LoadVarsFromJson(o) { for (const [sidStr,data] of Object.entries(o)) { const sid = parseInt(sidStr, 10); const eventVar = this.GetEventVariableBySID(sid); if (eventVar) eventVar.SetValue(data) } } _SaveScheduledWaitsToJson() { return this._scheduledWaits.filter(w=>!w.IsPromise()).map(w=>w._SaveToJson()) } _LoadScheduledWaitsFromJson(arr) { this.ClearAllScheduledWaits(); for (const data of arr) { const sw = C3.ScheduledWait._CreateFromJson(this, data); if (sw) this._scheduledWaits.push(sw) } } _GetPerfRecords() { return [...this._runtime.GetLayoutManager().runningLayouts()].map(l=>l.GetEventSheet()).filter(eventSheet=>eventSheet).map(e=>e._GetPerfRecord()) } FindFirstFunctionBlockParent(eventRow) { while (eventRow) { const scopeParent = eventRow.GetScopeParent(); if (scopeParent instanceof C3.FunctionBlock) return scopeParent; eventRow = eventRow.GetParent() } return null } _InvokeFunctionFromJS(name, params) { if (!Array.isArray(params)) params = []; const functionBlock = this.GetFunctionBlockByName(name.toLowerCase()); if (!functionBlock) return null; if (!functionBlock.IsEnabled()) return functionBlock.GetDefaultReturnValue(); const functionParameters = functionBlock.GetFunctionParameters(); if (params.length < functionParameters.length) { params = params.slice(0); do params.push(functionParameters[params.length].GetInitialValue()); while (params.length < functionParameters.length) } const callEventBlock = functionBlock.GetEventBlock(); return callEventBlock.RunAsExpressionFunctionCall(callEventBlock.GetSolModifiersIncludingParents(), functionBlock.GetReturnType(), functionBlock.GetDefaultReturnValue(), ...params) } } } ;'use strict'; { const C3 = self.C3; C3.EventSheet = class EventSheet extends C3.DefendedBase { constructor(eventSheetManager, data) { super(); this._eventSheetManager = eventSheetManager; this._runtime = eventSheetManager.GetRuntime(); this._name = data[0]; this._events = []; this._triggers = new Map; this._fastTriggers = new Map; this._eventsByDisplayNumber = new Map; this._hasRun = false; this._shallowIncludes = []; this._deepIncludes = []; this._alreadyIncludedSheets = new Set; for (const eventData of data[1]) this._CreateEvent(eventData, null, this._events); this._perfRecord = this._runtime.IsDebug() ? { type: "sheet", name: this._name, totalTimeCounter: 0, children: [] } : null } Release() { this._eventSheetManager = null; this._runtime = null } _CreateEvent(eventData, parent, nontriggers) { switch (eventData[0]) { case 0: case 3: this._CreateEventBlock(eventData, parent, nontriggers); break; case 1: this._CreateEventVariable(eventData, parent, nontriggers); break; case 2: this._CreateInclude(eventData, parent, nontriggers); break; case 4: this._CreateFunctionBlock(eventData, parent); break; case 5: this._CreateScriptBlock(eventData, parent, nontriggers); break; default: throw new Error("invalid event type"); } } _CreateEventBlock(data, parent, nontriggers) { const eventBlock = C3.EventBlock.Create(this, parent, data); if (eventBlock.IsOrBlock()) { nontriggers.push(eventBlock); const conditions = eventBlock.GetConditions(); for (let i = 0, len = conditions.length; i < len; ++i) if (conditions[i].IsTrigger()) this._InitTrigger(eventBlock, i) } else if (eventBlock.IsTrigger()) this._InitTrigger(eventBlock, 0); else nontriggers.push(eventBlock) } _CreateFunctionBlock(data, parent) { const functionBlock = C3.FunctionBlock.Create(this, parent, data); this._eventSheetManager._RegisterFunctionBlock(functionBlock) } _CreateEventVariable(data, parent, nontriggers) { const v = C3.EventVariable.Create(this, parent, data); nontriggers.push(v) } _CreateInclude(data, parent, nontriggers) { const include = C3.EventInclude.Create(this, parent, data); nontriggers.push(include) } _CreateScriptBlock(data, parent, nontriggers) { const scriptBlock = C3.EventScript.Create(this, parent, data); nontriggers.push(scriptBlock) } _InitTrigger(eventBlock, i) { if (!eventBlock.IsOrBlock()) this._eventSheetManager._AddTriggerToPostInit(eventBlock); const cnd = eventBlock.GetConditionAt(i); const func = cnd._GetFunc(); const objectClass = cnd.GetObjectClass(); if (cnd.IsFastTrigger()) { let methodMap = this._fastTriggers.get(objectClass); if (!methodMap) { methodMap = new Map; this._fastTriggers.set(objectClass, methodMap) } const value = cnd.GetFastTriggerValue().toLowerCase(); let valueMap = methodMap.get(func); if (!valueMap) { valueMap = new Map; methodMap.set(func, valueMap) } let triggerArr = valueMap.get(value); if (!triggerArr) { triggerArr = []; valueMap.set(value, triggerArr) } triggerArr.push([eventBlock, i]) } else { let ocInfo = this._triggers.get(objectClass); if (!ocInfo) { ocInfo = { methodMap: new Map, behaviors: new Map }; this._triggers.set(objectClass, ocInfo) } const behaviorType = cnd.GetBehaviorType(); let methodMap; if (behaviorType) { methodMap = ocInfo.behaviors.get(behaviorType); if (!methodMap) { methodMap = new Map; ocInfo.behaviors.set(behaviorType, methodMap) } } else methodMap = ocInfo.methodMap; let triggerArr = methodMap.get(func); if (!triggerArr) { triggerArr = []; methodMap.set(func, triggerArr) } triggerArr.push([eventBlock, i]) } } _PostInit() { const events = this._events; for (let i = 0, len = events.length; i < len; ++i) { const hasElseBlock = i < len - 1 && events[i + 1]instanceof C3.EventBlock && events[i + 1].IsElseBlock(); events[i]._PostInit(hasElseBlock) } } _AddShallowInclude(include) { this._shallowIncludes.push(include) } _UpdateDeepIncludes() { C3.clearArray(this._deepIncludes); this._AddDeepIncludes(this); this._alreadyIncludedSheets.clear() } _AddDeepIncludes(rootSheet) { const deepIncludes = rootSheet._deepIncludes; const alreadyIncludedSheets = rootSheet._alreadyIncludedSheets; for (const include of this._shallowIncludes) { const sheet = include.GetIncludeSheet(); if (!include.IsActive() || rootSheet === sheet || alreadyIncludedSheets.has(sheet)) continue; alreadyIncludedSheets.add(sheet); sheet._AddDeepIncludes(rootSheet); deepIncludes.push(sheet) } } deepIncludes() { return this._deepIncludes } GetEventSheetManager() { return this._eventSheetManager } GetRuntime() { return this._runtime } GetName() { return this._name } _RegisterEventByDisplayNumber(eventBlock, displayNumber) { this._eventsByDisplayNumber.set(displayNumber, eventBlock) } _GetEventByDisplayNumber(displayNumber) { return this._eventsByDisplayNumber.get(displayNumber) || null } _ResetHasRunFlag() { this._hasRun = false } Run() { if (this._hasRun) return; const runtime = this._runtime; const profile = runtime.IsCPUProfiling(); const startTime = profile ? performance.now() : 0; this._hasRun = true; const eventSheetManager = this.GetEventSheetManager(); const frame = eventSheetManager.GetCurrentEventStackFrame(); for (const e of this._events) { e.Run(frame); eventSheetManager.ClearSol(e.GetSolModifiers()); eventSheetManager.ClearAsyncActionPromises(); runtime.FlushPendingInstances() } frame.Reset(null); if (profile) this._perfRecord.totalTimeCounter += performance.now() - startTime } *DebugRun() { if (this._hasRun) return; this._hasRun = true; const runtime = this._runtime; const eventSheetManager = this.GetEventSheetManager(); const frame = eventSheetManager.GetCurrentEventStackFrame(); for (const e of this._events) { yield*e.DebugRun(frame); eventSheetManager.ClearSol(e.GetSolModifiers()); eventSheetManager.ClearAsyncActionPromises(); runtime.FlushPendingInstances() } frame.Reset(null) } _Trigger(method, inst, behaviorType) { if (inst) { const objectClass = inst.GetObjectClass(); let ret = false; let r = this._TriggerForClass(method, inst, objectClass, behaviorType); ret = ret || r; for (const family of objectClass.GetFamilies()) { r = this._TriggerForClass(method, inst, family, behaviorType); ret = ret || r } } else return this._TriggerForClass(method, inst, null, null) } _TriggerForClass(method, inst, objectClass, behaviorType) { const ocInfo = this._triggers.get(objectClass); if (!ocInfo) return false; const methodMap = behaviorType ? ocInfo.behaviors.get(behaviorType) : ocInfo.methodMap; if (!methodMap) return false; const triggerList = methodMap.get(method); if (!triggerList) return false; let ret = false; for (const [trigger,index] of triggerList) { const r = this._ExecuteTrigger(inst, trigger, index); ret = ret || r } return ret } *_DebugTrigger(method, inst, behaviorType) { if (inst) { const objectClass = inst.GetObjectClass(); let ret = false; let r = yield*this._DebugTriggerForClass(method, inst, objectClass, behaviorType); ret = ret || r; for (const family of objectClass.GetFamilies()) { r = yield*this._DebugTriggerForClass(method, inst, family, behaviorType); ret = ret || r } } else return yield*this._DebugTriggerForClass(method, inst, null, null) } *_DebugTriggerForClass(method, inst, objectClass, behaviorType) { const ocInfo = this._triggers.get(objectClass); if (!ocInfo) return false; const methodMap = behaviorType ? ocInfo.behaviors.get(behaviorType) : ocInfo.methodMap; if (!methodMap) return false; const triggerList = methodMap.get(method); if (!triggerList) return false; let ret = false; for (const [trigger,index] of triggerList) { let r; if (trigger.DebugCanRunFast()) r = this._ExecuteTrigger(inst, trigger, index); else r = yield*this._DebugExecuteTrigger(inst, trigger, index); ret = ret || r } return ret } _FastTrigger(method, inst, value) { const objectClass = inst.GetObjectClass(); const methodMap = this._fastTriggers.get(objectClass); if (!methodMap) return false; const valueMap = methodMap.get(method); if (!valueMap) return false; const triggerList = valueMap.get(value); if (!triggerList) return false; let ret = false; for (let i = 0, len = triggerList.length; i < len; ++i) { const t = triggerList[i]; const r = this._ExecuteTrigger(null, t[0], t[1]); ret = ret || r } return ret } *_DebugFastTrigger(method, inst, value) { const objectClass = inst.GetObjectClass(); const methodMap = this._fastTriggers.get(objectClass); if (!methodMap) return false; const valueMap = methodMap.get(method); if (!valueMap) return false; const triggerList = valueMap.get(value); if (!triggerList) return false; let ret = false; for (let i = 0, len = triggerList.length; i < len; ++i) { const t = triggerList[i]; const trigger = t[0]; const index = t[1]; let r; if (trigger.DebugCanRunFast()) r = this._ExecuteTrigger(null, trigger, index); else r = yield*this._DebugExecuteTrigger(null, trigger, index); ret = ret || r } return ret } _ExecuteTrigger(inst, trigger, index) { const runtime = this._runtime; const eventSheetManager = this._eventSheetManager; const currentEvent = eventSheetManager.GetCurrentEvent(); const eventStack = eventSheetManager.GetEventStack(); const triggerDepth = eventSheetManager.GetTriggerDepth(); let ret = false; if (currentEvent) eventSheetManager.PushCleanSol(currentEvent.GetSolModifiersIncludingParents()); eventSheetManager.PushCleanSol(trigger.GetSolModifiersIncludingParents()); const isRecursive = triggerDepth > 1; if (isRecursive) eventSheetManager.GetLocalVarStack().Push(); const frame = eventStack.Push(trigger); if (inst) { const objectClass = trigger.GetConditions()[index].GetObjectClass(); const sol = objectClass.GetCurrentSol(); sol.SetSinglePicked(inst); if (inst.IsInContainer()) inst.SetSiblingsSinglePicked() } let okToRun = true; if (trigger.GetParent()) { const parents = trigger.GetTriggerParents(); for (let i = 0, len = parents.length; i < len; ++i) if (!parents[i].RunPreTrigger(frame)) { okToRun = false; break } } if (okToRun) { runtime.IncrementExecCount(); if (trigger.IsOrBlock()) trigger.RunOrBlockTrigger(frame, index); else trigger.Run(frame); ret = frame.GetLastEventTrue() } eventStack.Pop(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); eventSheetManager.PopSol(trigger.GetSolModifiersIncludingParents()); if (currentEvent) eventSheetManager.PopSol(currentEvent.GetSolModifiersIncludingParents()); if (!currentEvent && triggerDepth === 1 && !eventSheetManager.IsFlushingBlocked()) runtime.FlushPendingInstances(); return ret } *_DebugExecuteTrigger(inst, trigger, index) { const runtime = this._runtime; const eventSheetManager = this._eventSheetManager; const currentEvent = eventSheetManager.GetCurrentEvent(); const eventStack = eventSheetManager.GetEventStack(); const triggerDepth = eventSheetManager.GetTriggerDepth(); let ret = false; if (currentEvent) eventSheetManager.PushCleanSol(currentEvent.GetSolModifiersIncludingParents()); eventSheetManager.PushCleanSol(trigger.GetSolModifiersIncludingParents()); const isRecursive = triggerDepth > 1; if (isRecursive) eventSheetManager.GetLocalVarStack().Push(); const frame = eventStack.Push(trigger); if (inst) { const objectClass = trigger.GetConditions()[index].GetObjectClass(); const sol = objectClass.GetCurrentSol(); sol.SetSinglePicked(inst); if (inst.IsInContainer()) inst.SetSiblingsSinglePicked() } let okToRun = true; if (trigger.GetParent()) { const parents = trigger.GetTriggerParents(); for (let i = 0, len = parents.length; i < len; ++i) if (!(yield*parents[i].DebugRunPreTrigger(frame))) { okToRun = false; break } } if (okToRun) { runtime.IncrementExecCount(); if (trigger.IsOrBlock()) yield*trigger.DebugRunOrBlockTrigger(frame, index); else yield*trigger.DebugRun(frame); ret = frame.GetLastEventTrue() } eventStack.Pop(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); eventSheetManager.PopSol(trigger.GetSolModifiersIncludingParents()); if (currentEvent) eventSheetManager.PopSol(currentEvent.GetSolModifiersIncludingParents()); if (!currentEvent && triggerDepth === 1 && !eventSheetManager.IsFlushingBlocked()) runtime.FlushPendingInstances(); return ret } _GetPerfRecord() { return this._perfRecord } } } ;'use strict'; { const C3 = self.C3; const EMPTY_ARRAY = []; function NoActions(frame, index) { return true } function *DebugNoActions(frame, index) { return true } C3.EventBlock = class EventBlock extends C3.DefendedBase { constructor(eventSheet, parent, data) { super(); this._eventSheet = eventSheet; this._runtime = eventSheet.GetRuntime(); this._parent = parent; this._scopeParent = null; this._eventStack = this._runtime.GetEventSheetManager().GetEventStack(); this._solModifiers = []; this._solModifiersIncludingParents = []; this._hasGotSolModifiersIncludingParents = false; this._isSolWriterAfterCnds = false; this._isTopLevelGroup = false; this._hasElseBlock = false; this._isOrBlock = !!data[2]; this._isElseBlock = false; this._triggerParents = null; this._conditions = []; this._actions = []; this._subEvents = []; this._RunActions = NoActions; this._DebugRunActions = DebugNoActions; this._isGroup = false; this._isInitiallyActive = false; this._groupName = ""; this._isGroupActive = false; this._containedIncludes = null; this._perfRecord = null; this._sid = data[4]; this._displayNumber = data[5]; this._eventSheet._RegisterEventByDisplayNumber(this, this._displayNumber); this._debugData = this._runtime.IsDebug() ? { isBreakpoint: data[3][0], isBreakable: data[3][1], canRunAllConditionsFast: false, canRunAllActionsFast: false, canRunAllSubEventsFast: false, canRunSelfFast: false } : null; this.GetEventSheetManager()._RegisterEventBlock(this); if (data[0] === 3) this._InitGroup(data[1]); let index = 0; for (const cndData of data[6]) { const condition = C3.Condition.Create(this, cndData, index++); this._conditions.push(condition); this._AddSolModifier(condition.GetObjectClass()) } index = 0; for (const actData of data[7]) { const action = C3.Action.Create(this, actData, index++); this._actions.push(action) } if (data.length === 9) { const subEventsData = data[8]; for (const eventData of subEventsData) this._eventSheet._CreateEvent(eventData, this, this._subEvents) } if (this._conditions.length) this._isElseBlock = this._conditions[0].GetObjectClass() === null && this._conditions[0]._GetFunc() === C3.Plugins.System.Cnds.Else; if (this._conditions.length === 0) this._conditions = EMPTY_ARRAY; if (this._actions.length === 0) this._actions = EMPTY_ARRAY; if (this._subEvents.length === 0) this._subEvents = EMPTY_ARRAY } static Create(eventSheet, parent, data) { return C3.New(C3.EventBlock, eventSheet, parent, data) } _InitGroup(groupData) { this._isGroup = true; this._isInitiallyActive = !!groupData[0]; this._isGroupActive = this._isInitiallyActive; this._groupName = groupData[1].toLowerCase(); this._containedIncludes = []; this.GetEventSheetManager()._RegisterGroup(this); if (this._runtime.IsDebug()) this._perfRecord = { type: "group", name: groupData[1], totalTimeCounter: 0, children: [] } } _AddContainedInclude(include) { this._containedIncludes.push(include) } _AddContainerSolModifierToList(objectClass, arr) { for (const containerType of objectClass.GetContainer().objectTypes()) if (!arr.includes(containerType)) arr.push(containerType) } _AddSolModifierToList(objectClass, arr) { if (!objectClass) return; if (!arr.includes(objectClass)) arr.push(objectClass); if (objectClass.IsFamily()) for (const familyMember of objectClass.GetFamilyMembers()) { if (familyMember.IsInContainer()) this._AddContainerSolModifierToList(familyMember, arr) } else if (objectClass.IsInContainer()) this._AddContainerSolModifierToList(objectClass, arr) } _AddSolModifier(objectClass) { this._AddSolModifierToList(objectClass, this._solModifiers) } _AddParentSolModifier(objectClass) { this._AddSolModifierToList(objectClass, this._solModifiersIncludingParents) } SetAllSolModifiers() { this._solModifiers = this._runtime.GetAllObjectClasses() } _PostInit(hasElse) { this._hasElseBlock = !!hasElse; this._IdentifyTopLevelGroup(); this._IdentifyTriggerParents(); for (const c of this._conditions) c._PostInit(); if (this._actions.length > 0) { let hasAnyActionWithReturnType = false; for (const a of this._actions) { a._PostInit(); if (a.HasReturnType()) hasAnyActionWithReturnType = true } if (hasAnyActionWithReturnType) { this._RunActions = this._RunActions_ReturnValue; this._DebugRunActions = this._DebugRunActions_ReturnValue } else { this._RunActions = this._RunActions_Fast; this._DebugRunActions = this._DebugRunActions_Fast } } const subEvents = this._subEvents; for (let i = 0, len = subEvents.length; i < len; ++i) { const hasElseBlock = i < len - 1 && subEvents[i + 1]instanceof C3.EventBlock && subEvents[i + 1].IsElseBlock(); subEvents[i]._PostInit(hasElseBlock) } if (this._debugData) this._UpdateCanRunFast(); if (this._perfRecord) this._GetPerfRecordParent()._GetPerfRecord().children.push(this._perfRecord) } _GetPerfRecord() { return this._perfRecord } _GetPerfRecordParent() { let p = this.GetParent(); while (p) { if (p.IsGroup()) return p; p = p.GetParent() } return this._eventSheet } _UpdateCanRunFast() { const dd = this._debugData; dd.canRunAllConditionsFast = this._conditions.every(c=>c.DebugCanRunFast()); dd.canRunAllActionsFast = this._actions.every(a=>a.DebugCanRunFast()); dd.canRunAllSubEventsFast = this._subEvents.every(s=>s.DebugCanRunFast()); dd.canRunSelfFast = dd.canRunAllConditionsFast && dd.canRunAllActionsFast && dd.canRunAllSubEventsFast } _UpdateCanRunFastRecursive() { let e = this; do { e._UpdateCanRunFast(); e = e.GetParent() } while (e) } _IdentifyTopLevelGroup() { if (!this.IsGroup()) return; let p = this.GetParent(); this._isTopLevelGroup = true; while (p) { if (!p.IsGroup()) { this._isTopLevelGroup = false; break } p = p.GetParent() } } _IdentifySolModifiersIncludingParents() { const allObjectClasses = this._runtime.GetAllObjectClasses(); if (this._solModifiers === allObjectClasses) this._solModifiersIncludingParents = allObjectClasses; else { this._solModifiersIncludingParents = C3.cloneArray(this._solModifiers); let p = this.GetParent(); while (p) { for (const o of p._solModifiers) this._AddParentSolModifier(o); p = p.GetParent() } const eventSheetManager = this.GetEventSheetManager(); this._solModifiers = eventSheetManager._DeduplicateSolModifierList(this._solModifiers); this._solModifiersIncludingParents = eventSheetManager._DeduplicateSolModifierList(this._solModifiersIncludingParents) } } _IdentifyTriggerParents() { if (!this.HasAnyTriggeredCondition()) return; this._triggerParents = []; let p = this.GetParent(); while (p) { this._triggerParents.push(p); p = p.GetParent() } this._triggerParents.reverse() } SetSolWriterAfterCnds() { this._isSolWriterAfterCnds = true; if (this._parent) this._parent.SetSolWriterAfterCnds() } IsSolWriterAfterCnds() { return this._isSolWriterAfterCnds } GetSolModifiers() { return this._solModifiers } GetSolModifiersIncludingParents() { if (!this._hasGotSolModifiersIncludingParents) { this._hasGotSolModifiersIncludingParents = true; this._IdentifySolModifiersIncludingParents() } return this._solModifiersIncludingParents } HasSolModifier(objectClass) { return this._solModifiers.includes(objectClass) } GetTriggerParents() { return this._triggerParents } GetEventSheet() { return this._eventSheet } GetEventSheetManager() { return this._eventSheet.GetEventSheetManager() } GetRuntime() { return this._runtime } GetParent() { return this._parent } _SetScopeParent(p) { this._scopeParent = p } GetScopeParent() { return this._scopeParent || this._parent } GetDisplayNumber() { return this._displayNumber } IsDebugBreakable() { return this._debugData && this._debugData.isBreakable } IsDebugBreakpoint() { return this.IsDebugBreakable() && this._debugData.isBreakpoint } _SetDebugBreakpoint(b) { this._debugData.isBreakpoint = !!b; this._UpdateCanRunFastRecursive() } IsGroup() { return this._isGroup } IsTopLevelGroup() { return this._isTopLevelGroup } IsElseBlock() { return this._isElseBlock } HasElseBlock() { return this._hasElseBlock } GetGroupName() { return this._groupName } IsGroupActive() { return this._isGroupActive } ResetInitialActivation() { this.SetGroupActive(this._isInitiallyActive) } SetGroupActive(a) { a = !!a; if (!this._isGroup) throw new Error("not a group"); if (this._isGroupActive === a) return; this._isGroupActive = a; for (const include of this._containedIncludes) include.UpdateActive(); if (this._containedIncludes.length) { const currentLayout = this._runtime.GetCurrentLayout(); const mainEventSheet = currentLayout.GetEventSheet(); if (mainEventSheet) mainEventSheet._UpdateDeepIncludes() } } GetSID() { return this._sid } IsOrBlock() { return this._isOrBlock } IsTrigger() { return this._conditions.length && this._conditions[0].IsTrigger() } IsForFunctionBlock() { return this._scopeParent && this._scopeParent instanceof C3.FunctionBlock } HasAnyTriggeredCondition() { return this.IsForFunctionBlock() || this._conditions.some(c=>c.IsTrigger()) } GetConditions() { return this._conditions } GetConditionCount() { return this._conditions.length } GetConditionAt(i) { i = Math.floor(i); if (i < 0 || i >= this._conditions.length) throw new RangeError("invalid condition index"); return this._conditions[i] } GetConditionByDebugIndex(i) { return this.GetConditionAt(i) } IsFirstConditionOfType(cnd) { let i = cnd.GetIndex(); if (i === 0) return true; --i; for (; i >= 0; --i) if (this._conditions[i].GetObjectClass() === cnd.GetObjectClass()) return false; return true } GetActions() { return this._actions } GetActionCount() { return this._actions.length } GetActionAt(i) { i = Math.floor(i); if (i < 0 || i >= this._actions.length) throw new RangeError("invalid action index"); return this._actions[i] } GetActionByDebugIndex(i) { i = Math.floor(i); const ret = this._actions.find(a=>a.GetDebugIndex() === i); if (!ret) throw new RangeError("invalid action debug index"); return ret } _HasActionIndex(i) { i = Math.floor(i); return i >= 0 && i < this._actions.length } GetSubEvents() { return this._subEvents } _GetAllLocalVariablesInScope() { return this._subEvents.filter(e=>e instanceof C3.EventVariable) } RunPreTrigger(frame) { frame.SetCurrentEvent(this); let isAnyTrue = false; const conditions = this._conditions; for (let i = 0, len = conditions.length; i < len; ++i) { const c = conditions[i]; frame.SetConditionIndex(i); if (c.IsLooping()) throw new Error("trigger cannot be used as sub-event to a loop"); if (c.Run()) isAnyTrue = true; else if (!this._isOrBlock) return false } return this._isOrBlock ? isAnyTrue : true } RunOrBlockTrigger(frame, index) { frame.SetCurrentEvent(this); if (this._conditions[index].Run()) { if (this._RunActions(frame, 0)) this._RunSubEvents(frame); frame.SetLastEventTrue(true) } } *DebugRunPreTrigger(frame) { frame.SetCurrentEvent(this); let isAnyTrue = false; const conditions = this._conditions; for (let i = 0, len = conditions.length; i < len; ++i) { const c = conditions[i]; frame.SetConditionIndex(i); if (c.IsLooping()) throw new Error("trigger cannot be used as sub-event to a loop"); let ret; if (c.DebugCanRunFast()) ret = c.Run(); else ret = yield*c.DebugRun(); if (ret) isAnyTrue = true; else if (!this._isOrBlock) return false } return this._isOrBlock ? isAnyTrue : true } *DebugRunOrBlockTrigger(frame, index) { frame.SetCurrentEvent(this); const c = this._conditions[index]; let ret; if (c.DebugCanRunFast()) ret = c.Run(); else ret = yield*c.DebugRun(); if (ret) { let actRet; if (this.DebugCanRunActionsFast()) actRet = this._RunActions(frame, 0); else actRet = yield*this._DebugRunActions(frame, 0); if (actRet) if (this.DebugCanRunSubEventsFast()) this._RunSubEvents(); else yield*this._DebugRunSubEvents(); frame.SetLastEventTrue(true) } } Run(frame) { frame.SetCurrentEvent(this); if (!this._isElseBlock) frame.SetElseBranchRan(false); if (this._isOrBlock) this._RunOrBlock(frame); else this._RunAndBlock(frame) } *DebugRun(frame) { if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext()) yield this; frame.SetCurrentEvent(this); if (!this._isElseBlock) frame.SetElseBranchRan(false); if (this._isOrBlock) yield*this._DebugRunOrBlock(frame); else yield*this._DebugRunAndBlock(frame) } _RunOrBlock(frame) { const conditions = this._conditions; let isAnyTrue = conditions.length === 0; for (let i = 0, len = conditions.length; i < len; ++i) { const c = conditions[i]; if (c.IsTrigger()) continue; frame.SetConditionIndex(i); const result = c.Run(); isAnyTrue = isAnyTrue || result } frame.SetLastEventTrue(isAnyTrue); if (isAnyTrue) { if (this._RunActions(frame, 0)) this._RunSubEvents(frame); if (this._hasElseBlock) frame.SetElseBranchRan(true) } } *_DebugRunOrBlock(frame) { const conditions = this._conditions; let isAnyTrue = conditions.length === 0; for (let i = 0, len = conditions.length; i < len; ++i) { const c = conditions[i]; if (c.IsTrigger()) continue; frame.SetConditionIndex(i); let ret; if (c.DebugCanRunFast()) ret = c.Run(); else ret = yield*c.DebugRun(); isAnyTrue = isAnyTrue || ret } frame.SetLastEventTrue(isAnyTrue); if (isAnyTrue) { let actRet; if (this.DebugCanRunActionsFast()) actRet = this._RunActions(frame, 0); else actRet = yield*this._DebugRunActions(frame, 0); if (actRet) if (this.DebugCanRunSubEventsFast()) this._RunSubEvents(); else yield*this._DebugRunSubEvents(); if (this._hasElseBlock) frame.SetElseBranchRan(true) } } _RunAndBlock(frame) { const conditions = this._conditions; for (let i = 0, len = conditions.length; i < len; ++i) { const c = conditions[i]; frame.SetConditionIndex(i); const result = c.Run(); if (!result) { frame.SetLastEventTrue(false); return } } frame.SetLastEventTrue(true); if (this._RunActions(frame, 0)) this._RunSubEvents(frame); if (frame.GetLastEventTrue() && this._hasElseBlock) frame.SetElseBranchRan(true) } *_DebugRunAndBlock(frame) { const conditions = this._conditions; for (let i = 0, len = conditions.length; i < len; ++i) { const c = conditions[i]; frame.SetConditionIndex(i); let ret; if (c.DebugCanRunFast()) ret = c.Run(); else ret = yield*c.DebugRun(); if (!ret) { frame.SetLastEventTrue(false); return } } frame.SetLastEventTrue(true); let actRet; if (this.DebugCanRunActionsFast()) actRet = this._RunActions(frame, 0); else actRet = yield*this._DebugRunActions(frame, 0); if (actRet) if (this.DebugCanRunSubEventsFast()) this._RunSubEvents(); else yield*this._DebugRunSubEvents(); if (frame.GetLastEventTrue() && this._hasElseBlock) frame.SetElseBranchRan(true) } _RunActions_Fast(frame, startIndex) { const actions = this._actions; for (let i = startIndex, len = actions.length; i < len; ++i) { const a = actions[i]; frame.SetActionIndex(i); a.Run() } return true } *_DebugRunActions_Fast(frame, startIndex) { const actions = this._actions; for (let i = startIndex, len = actions.length; i < len; ++i) { const a = actions[i]; frame.SetActionIndex(i); if (a.DebugCanRunFast()) a.Run(); else yield*a.DebugRun() } return true } _RunActions_ReturnValue(frame, startIndex) { const eventSheetManager = this.GetEventSheetManager(); const actions = this._actions; for (let i = startIndex, len = actions.length; i < len; ++i) { const a = actions[i]; frame.SetActionIndex(i); const ret = a.Run(); if (a.CanBailOut() && ret === true) return false; else if (a.IsAsync() && ret instanceof Promise) eventSheetManager.AddAsyncActionPromise(ret) } return true } *_DebugRunActions_ReturnValue(frame, startIndex) { const eventSheetManager = this.GetEventSheetManager(); const actions = this._actions; for (let i = startIndex, len = actions.length; i < len; ++i) { const a = actions[i]; frame.SetActionIndex(i); let ret; if (a.DebugCanRunFast()) ret = a.Run(); else ret = yield*a.DebugRun(); if (a.CanBailOut() && ret === true) return false; else if (a.IsAsync() && ret instanceof Promise) eventSheetManager.AddAsyncActionPromise(ret) } return true } _ResumeActionsAndSubEvents(frame) { if (this._RunActions(frame, frame.GetActionIndex())) this._RunSubEvents() } *_DebugResumeActionsAndSubEvents(frame) { if (yield*this._DebugRunActions(frame, frame.GetActionIndex())) yield*this._DebugRunSubEvents() } _RunSubEvents() { if (!this._subEvents.length) return; const profile = this.IsGroup() && this._runtime.IsCPUProfiling(); const startTime = profile ? performance.now() : 0; const eventStack = this._eventStack; const frame = eventStack.Push(this); if (this._isSolWriterAfterCnds) this._RunSubEvents_SolWriterAfterCnds(frame); else this._RunSubEvents_Fast(frame); eventStack.Pop(); if (profile) this._perfRecord.totalTimeCounter += performance.now() - startTime } _RunSubEvents_SolWriterAfterCnds(frame) { const isGroup = this._isGroup; const isTopLevelGroup = this._isTopLevelGroup; const eventSheetManager = this.GetEventSheetManager(); const subEvents = this._subEvents; for (let i = 0, len = subEvents.length, last = len - 1; i < len; ++i) { const e = subEvents[i]; const solModifiers = e.GetSolModifiers(); const copySol = !isTopLevelGroup || !isGroup && i < last; if (copySol) eventSheetManager.PushCopySol(solModifiers); e.Run(frame); if (copySol) eventSheetManager.PopSol(solModifiers); else eventSheetManager.ClearSol(solModifiers) } } _RunSubEvents_Fast(frame) { const subEvents = this._subEvents; for (let i = 0, len = subEvents.length; i < len; ++i) subEvents[i].Run(frame) } *_DebugRunSubEvents() { if (!this._subEvents.length) return; const eventStack = this._eventStack; const frame = eventStack.Push(this); if (this._isSolWriterAfterCnds) yield*this._DebugRunSubEvents_SolWriterAfterCnds(frame); else yield*this._DebugRunSubEvents_Fast(frame); eventStack.Pop() } *_DebugRunSubEvents_SolWriterAfterCnds(frame) { const isGroup = this._isGroup; const isTopLevelGroup = this._isTopLevelGroup; const eventSheetManager = this.GetEventSheetManager(); const subEvents = this._subEvents; for (let i = 0, len = subEvents.length, last = len - 1; i < len; ++i) { const e = subEvents[i]; const solModifiers = e.GetSolModifiers(); const copySol = !isTopLevelGroup || !isGroup && i < last; if (copySol) eventSheetManager.PushCopySol(solModifiers); yield*e.DebugRun(frame); if (copySol) eventSheetManager.PopSol(solModifiers); else eventSheetManager.ClearSol(solModifiers) } } *_DebugRunSubEvents_Fast(frame) { const subEvents = this._subEvents; for (let i = 0, len = subEvents.length; i < len; ++i) yield*subEvents[i].DebugRun(frame) } Retrigger(oldFrame, newFrame) { this._runtime.IncrementExecCount(); newFrame.ResetQuick(); const conditions = this._conditions; if (!this.IsOrBlock()) for (let i = oldFrame.GetConditionIndex() + 1, len = conditions.length; i < len; ++i) { const c = conditions[i]; newFrame.SetConditionIndex(i); const result = c.Run(); if (!result) return false } if (this._RunActions(newFrame, 0)) this._RunSubEvents(newFrame); return true } *DebugRetrigger(oldFrame, newFrame) { this._runtime.IncrementExecCount(); newFrame.ResetQuick(); const conditions = this._conditions; if (!this.IsOrBlock()) for (let i = oldFrame.GetConditionIndex() + 1, len = conditions.length; i < len; ++i) { const c = conditions[i]; newFrame.SetConditionIndex(i); let ret; if (c.DebugCanRunFast()) ret = c.Run(); else ret = yield*c.DebugRun(); if (!ret) return false } let actRet; if (this.DebugCanRunActionsFast()) actRet = this._RunActions(newFrame, 0); else actRet = yield*this._DebugRunActions(newFrame, 0); if (actRet) if (this.DebugCanRunSubEventsFast()) this._RunSubEvents(); else yield*this._DebugRunSubEvents(); return true } DebugCanRunFast() { return !this.IsDebugBreakpoint() && !this._runtime.DebugBreakNext() && this._debugData.canRunSelfFast } DebugCanRunActionsFast() { return !this._runtime.DebugBreakNext() && this._debugData.canRunAllActionsFast } DebugCanRunSubEventsFast() { return !this._runtime.DebugBreakNext() && this._debugData.canRunAllSubEventsFast } _CheckParentsOKToRun(frame) { if (this.GetParent()) { const parents = this.GetTriggerParents(); for (let i = 0, len = parents.length; i < len; ++i) if (!parents[i].RunPreTrigger(frame)) return false } return true } *_DebugCheckParentsOKToRun(frame) { if (this.GetParent()) { const parents = this.GetTriggerParents(); for (let i = 0, len = parents.length; i < len; ++i) if (!(yield*parents[i].DebugRunPreTrigger(frame))) return false } return true } _EvaluateFunctionCallParameters(eventSheetManager, parameters, isRecursive) { if (parameters.length > 0) if (isRecursive) { const paramResults = parameters.map(p=>p.Get(0)); eventSheetManager.GetLocalVarStack().Push(); this._scopeParent.SetFunctionParameters(paramResults) } else this._scopeParent.EvaluateFunctionParameters(parameters); else if (isRecursive) eventSheetManager.GetLocalVarStack().Push() } RunAsFunctionCall(combinedSolModifiers, parameters) { let ret; let asyncId; const hasAnySolModifiers = combinedSolModifiers.length > 0; const runtime = this._runtime; const eventStack = this._eventStack; const eventSheetManager = runtime.GetEventSheetManager(); const triggerDepth = eventSheetManager._IncTriggerDepth(); const isRecursive = triggerDepth > 1; this._EvaluateFunctionCallParameters(eventSheetManager, parameters, isRecursive); if (hasAnySolModifiers) eventSheetManager.PushCleanSol(combinedSolModifiers); const frame = eventStack.Push(this); if (this._CheckParentsOKToRun(frame)) { runtime.IncrementExecCount(); frame.SetCurrentEvent(this); const isAsync = this._scopeParent.IsAsync(); if (isAsync) [asyncId,ret] = this._scopeParent.StartAsyncFunctionCall(); this._RunAndBlock(frame); if (isAsync) this._scopeParent.MaybeFinishAsyncFunctionCall(asyncId) } eventStack.Pop(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); if (hasAnySolModifiers) eventSheetManager.PopSol(combinedSolModifiers); eventSheetManager._DecTriggerDepth(); return ret } *DebugRunAsFunctionCall(combinedSolModifiers, parameters) { let ret; let asyncId; if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext()) yield this; const hasAnySolModifiers = combinedSolModifiers.length > 0; const runtime = this._runtime; const eventStack = this._eventStack; const eventSheetManager = runtime.GetEventSheetManager(); const triggerDepth = eventSheetManager._IncTriggerDepth(); const isRecursive = triggerDepth > 1; this._EvaluateFunctionCallParameters(eventSheetManager, parameters, isRecursive); if (hasAnySolModifiers) eventSheetManager.PushCleanSol(combinedSolModifiers); const frame = eventStack.Push(this); if (yield*this._DebugCheckParentsOKToRun(frame)) { runtime.IncrementExecCount(); frame.SetCurrentEvent(this); const isAsync = this._scopeParent.IsAsync(); if (isAsync) [asyncId,ret] = this._scopeParent.StartAsyncFunctionCall(); yield*this._DebugRunAndBlock(frame); if (isAsync) this._scopeParent.MaybeFinishAsyncFunctionCall(asyncId) } eventStack.Pop(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); if (hasAnySolModifiers) eventSheetManager.PopSol(combinedSolModifiers); eventSheetManager._DecTriggerDepth(); return ret } RunAsMappedFunctionCall(paramResults) { const solModifiers = this.GetSolModifiersIncludingParents(); const hasAnySolModifiers = solModifiers.length > 0; const runtime = this._runtime; const eventStack = this._eventStack; const eventSheetManager = runtime.GetEventSheetManager(); const triggerDepth = eventSheetManager._IncTriggerDepth(); const isRecursive = triggerDepth > 1; if (isRecursive) eventSheetManager.GetLocalVarStack().Push(); this._scopeParent.SetFunctionParameters(paramResults); if (hasAnySolModifiers) eventSheetManager.PushCleanSol(solModifiers); const frame = eventStack.Push(this); if (this._CheckParentsOKToRun(frame)) { runtime.IncrementExecCount(); frame.SetCurrentEvent(this); this._RunAndBlock(frame) } eventStack.Pop(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); if (hasAnySolModifiers) eventSheetManager.PopSol(solModifiers); eventSheetManager._DecTriggerDepth() } *DebugRunAsMappedFunctionCall(paramResults) { if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext()) yield this; const solModifiers = this.GetSolModifiersIncludingParents(); const hasAnySolModifiers = solModifiers.length > 0; const runtime = this._runtime; const eventStack = this._eventStack; const eventSheetManager = runtime.GetEventSheetManager(); const triggerDepth = eventSheetManager._IncTriggerDepth(); const isRecursive = triggerDepth > 1; if (isRecursive) eventSheetManager.GetLocalVarStack().Push(); this._scopeParent.SetFunctionParameters(paramResults); if (hasAnySolModifiers) eventSheetManager.PushCleanSol(solModifiers); const frame = eventStack.Push(this); if (yield*this._DebugCheckParentsOKToRun(frame)) { runtime.IncrementExecCount(); frame.SetCurrentEvent(this); yield*this._DebugRunAndBlock(frame) } eventStack.Pop(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); if (hasAnySolModifiers) eventSheetManager.PopSol(solModifiers); eventSheetManager._DecTriggerDepth() } RunAsExpressionFunctionCall(combinedSolModifiers, returnType, defaultReturnValue, ...paramResults) { let ret; let asyncId; const hasAnySolModifiers = combinedSolModifiers.length > 0; const runtime = this._runtime; const eventStack = this._eventStack; const eventSheetManager = runtime.GetEventSheetManager(); const triggerDepth = eventSheetManager._IncTriggerDepth(); const isRecursive = triggerDepth > 1; if (isRecursive) eventSheetManager.GetLocalVarStack().Push(); if (paramResults.length > 0) this._scopeParent.SetFunctionParameters(paramResults); if (hasAnySolModifiers) eventSheetManager.PushCleanSol(combinedSolModifiers); const frame = eventStack.Push(this); frame.InitCallFunctionExpression(returnType, defaultReturnValue); eventStack.PushExpFunc(frame); runtime.SetDebuggingEnabled(false); if (this._CheckParentsOKToRun(frame)) { runtime.IncrementExecCount(); frame.SetCurrentEvent(this); const isAsync = this._scopeParent.IsAsync(); if (isAsync) [asyncId,ret] = this._scopeParent.StartAsyncFunctionCall(); this._RunAndBlock(frame); if (isAsync) this._scopeParent.MaybeFinishAsyncFunctionCall(asyncId) } runtime.SetDebuggingEnabled(true); eventStack.Pop(); eventStack.PopExpFunc(); if (isRecursive) eventSheetManager.GetLocalVarStack().Pop(); if (hasAnySolModifiers) eventSheetManager.PopSol(combinedSolModifiers); eventSheetManager._DecTriggerDepth(); return ret || frame.GetFunctionReturnValue() } } } ;'use strict'; { const C3 = self.C3; const EMPTY_SOL_MODIFIERS = []; let hadUserScriptException = false; C3.EventScript = class EventScript extends C3.DefendedBase { constructor(eventSheet, parent, data) { super(); const runtime = eventSheet.GetRuntime(); const eventSheetManager = eventSheet.GetEventSheetManager(); this._eventSheet = eventSheet; this._eventSheetManager = eventSheetManager; this._runtime = eventSheet.GetRuntime(); this._parent = parent; const userMethod = runtime.GetObjectReference(data[1]); this._func = userMethod; this._displayNumber = data[2]; this._eventSheet._RegisterEventByDisplayNumber(this, this._displayNumber); this._debugData = runtime.IsDebug() ? { isBreakpoint: data[3][0], isBreakable: data[3][1] } : null } static Create(eventSheet, parent, data) { return C3.New(C3.EventScript, eventSheet, parent, data) } _PostInit() { const userMethod = this._func; const localVars = this._runtime.GetEventSheetManager()._GetLocalVariablesScriptInterface(this); this._func = userMethod.bind(null, this._runtime.GetIRuntime(), localVars) } GetParent() { return this._parent } GetScopeParent() { return this._parent } GetEventSheet() { return this._eventSheet } GetDisplayNumber() { return this._displayNumber } IsDebugBreakable() { return this._debugData && this._debugData.isBreakable } IsDebugBreakpoint() { return this.IsDebugBreakable() && this._debugData.isBreakpoint } _SetDebugBreakpoint(b) { this._debugData.isBreakpoint = !!b } IsElseBlock() { return false } GetSolModifiers() { return EMPTY_SOL_MODIFIERS } GetSolModifiersIncludingParents() { if (this._parent) return this._parent.GetSolModifiersIncludingParents(); else return EMPTY_SOL_MODIFIERS } Run(frame) { frame.SetCurrentEvent(this); this._eventSheetManager.AddAsyncActionPromise(this._RunUserScript()) } async _RunUserScript() { try { await this._func() } catch (err) { console.error(`Unhandled exception running script %c${this.GetEventSheet().GetName()}, event ${this.GetDisplayNumber()}:`, "font-size: 1.2em; font-weight: bold;", err); if (self.C3Debugger) self.C3Debugger._SetLastErrorScript(this); if (!hadUserScriptException) { console.info(`%cTip:%c run this to highlight in Construct the last script that had an error: %cgoToLastErrorScript()`, "font-weight: bold; text-decoration: underline", "", "font-weight: bold"); hadUserScriptException = true } } } *DebugRun(frame) { frame.SetCurrentEvent(this); if (this.IsDebugBreakpoint() || this._runtime.DebugBreakNext()) yield this; this.Run(frame) } DebugCanRunFast() { return !this.IsDebugBreakpoint() && !this._runtime.DebugBreakNext() } static HadUserScriptException() { return hadUserScriptException } static SetHadUserScriptException() { hadUserScriptException = true } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; C3.FunctionBlock = class FunctionBlock extends C3.DefendedBase { constructor(eventSheet, parent, data) { super(); this._eventSheet = eventSheet; this._runtime = eventSheet.GetRuntime(); this._parent = parent; const funcData = data[1]; this._functionName = funcData[0]; this._returnType = funcData[1]; this._functionParameters = funcData[2].map(paramData=>C3.EventVariable.Create(eventSheet, this, paramData)); this._isEnabled = funcData[3]; this._isAsync = funcData[4]; this._nextAsyncId = 0; this._currentAsyncId = -1; this._asyncMap = new Map; this._eventBlock = C3.EventBlock.Create(eventSheet, parent, data); this._eventBlock._SetScopeParent(this) } static Create(eventSheet, parent, data) { return C3.New(C3.FunctionBlock, eventSheet, parent, data) } _PostInit() { for (const fp of this._functionParameters) fp._PostInit(); this._eventBlock._PostInit(false) } _GetAllLocalVariablesInScope() { return this._functionParameters } GetFunctionParameters() { return this._functionParameters } GetFunctionParameterCount() { return this._functionParameters.length } EvaluateFunctionParameters(parameters) { const functionParameters = this._functionParameters; for (let i = 0, len = functionParameters.length; i < len; ++i) functionParameters[i].SetValue(parameters[i].Get(0)) } SetFunctionParameters(paramResults) { const functionParameters = this._functionParameters; for (let i = 0, len = functionParameters.length; i < len; ++i) functionParameters[i].SetValue(paramResults[i]) } CaptureFunctionParameters() { return this._functionParameters.map(p=>p.GetValue()) } GetParent() { return this._parent } GetScopeParent() { return this._parent } GetFunctionName() { return this._functionName } GetReturnType() { return this._returnType } IsEnabled() { return this._isEnabled } GetDefaultReturnValue() { switch (this._returnType) { case 0: return null; case 2: return ""; default: return 0 } } GetEventBlock() { return this._eventBlock } IsAsync() { return this._isAsync } StartAsyncFunctionCall() { const asyncId = this._nextAsyncId++; this._currentAsyncId = asyncId; let resolve; const promise = new Promise(r=>resolve = r); this._asyncMap.set(asyncId, { resolve, pauseCount: 0 }); return [asyncId, promise] } MaybeFinishAsyncFunctionCall(asyncId) { const info = this._asyncMap.get(asyncId); if (info.pauseCount === 0) { info.resolve(); this._asyncMap.delete(asyncId) } this._currentAsyncId = -1 } PauseCurrentAsyncFunction() { const info = this._asyncMap.get(this._currentAsyncId); info.pauseCount++; return this._currentAsyncId } ResumeAsyncFunction(asyncId) { this._currentAsyncId = asyncId; const info = this._asyncMap.get(asyncId); info.pauseCount-- } } } ;'use strict'; { const C3 = self.C3; const EMPTY_SOL_MODIFIERS = []; C3.EventVariable = class EventVariable extends C3.DefendedBase { constructor(eventSheet, parent, data) { super(); const eventSheetManager = eventSheet.GetEventSheetManager(); this._eventSheet = eventSheet; this._eventSheetManager = eventSheetManager; this._runtime = eventSheet.GetRuntime(); this._parent = parent; this._localVarStack = eventSheetManager.GetLocalVarStack(); this._name = data[1]; this._type = data[2]; this._initialValue = data[3]; this._isStatic = !!data[4]; this._isConstant = !!data[5]; this._isFunctionParameter = parent instanceof C3.FunctionBlock; this._sid = data[6]; this._jsPropName = this._runtime.GetJsPropName(data[8]); this._scriptSetter = v=>this.SetValue(v); this._scriptGetter = ()=>this.GetValue(); this._hasSingleValue = !this._parent || this._isStatic || this._isConstant; this._value = this._initialValue; this._localIndex = -1; if (this.IsBoolean()) this._value = this._value ? 1 : 0; if (this.IsLocal() && !this.IsStatic() && !this.IsConstant()) this._localIndex = eventSheetManager._GetNextLocalVarIndex(this); eventSheetManager._RegisterEventVariable(this) } static Create(eventSheet, parent, data) { return C3.New(C3.EventVariable, eventSheet, parent, data) } _PostInit() {} GetName() { return this._name } GetJsPropName() { return this._jsPropName } GetParent() { return this._parent } IsGlobal() { return !this.GetParent() } IsLocal() { return !this.IsGlobal() } IsFunctionParameter() { return this._isFunctionParameter } IsStatic() { return this._isStatic } IsConstant() { return this._isConstant } IsNumber() { return this._type === 0 } IsString() { return this._type === 1 } IsBoolean() { return this._type === 2 } IsElseBlock() { return false } GetSID() { return this._sid } GetInitialValue() { return this._initialValue } GetSolModifiers() { return EMPTY_SOL_MODIFIERS } Run(frame) { if (this.IsLocal() && !this.IsStatic() && !this.IsConstant()) this.SetValue(this.GetInitialValue()) } DebugCanRunFast() { return true } *DebugRun(frame) { this.Run(frame) } SetValue(v) { if (this.IsNumber()) { if (typeof v !== "number") v = parseFloat(v) } else if (this.IsString()) { if (typeof v !== "string") v = v.toString() } else if (this.IsBoolean()) v = v ? 1 : 0; if (this._hasSingleValue) this._value = v; else this._localVarStack.GetCurrent()[this._localIndex] = v } GetValue() { return this._hasSingleValue ? this._value : this._localVarStack.GetCurrent()[this._localIndex] } GetTypedValue() { let ret = this.GetValue(); if (this.IsBoolean()) ret = !!ret; return ret } ResetToInitialValue() { this._value = this._initialValue } _GetScriptInterfaceDescriptor() { return { configurable: false, enumerable: true, get: this._scriptGetter, set: this._scriptSetter } } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; const EMPTY_SOL_MODIFIERS = []; C3.EventInclude = class EventInclude extends C3.DefendedBase { constructor(eventSheet, parent, data) { super(); const eventSheetManager = eventSheet.GetEventSheetManager(); this._eventSheet = eventSheet; this._eventSheetManager = eventSheetManager; this._runtime = eventSheet.GetRuntime(); this._parent = parent; this._includeSheet = null; this._includeSheetName = data[1]; this._isActive = true } static Create(eventSheet, parent, data) { return C3.New(C3.EventInclude, eventSheet, parent, data) } _PostInit() { this._includeSheet = this._eventSheetManager.GetEventSheetByName(this._includeSheetName); this._eventSheet._AddShallowInclude(this); let p = this.GetParent(); while (p) { if (p instanceof C3.EventBlock && p.IsGroup()) p._AddContainedInclude(this); p = p.GetParent() } this.UpdateActive(); if (this._runtime.IsDebug()) this._eventSheet._GetPerfRecord().children.push(this._includeSheet._GetPerfRecord()) } GetParent() { return this._parent } GetSolModifiers() { return EMPTY_SOL_MODIFIERS } GetIncludeSheet() { return this._includeSheet } Run(frame) { const pushSol = !!this.GetParent(); const allObjectClasses = this._runtime.GetAllObjectClasses(); if (pushSol) this._eventSheetManager.PushCleanSol(allObjectClasses); this._includeSheet.Run(); if (pushSol) this._eventSheetManager.PopSol(allObjectClasses) } *DebugRun(frame) { const pushSol = !!this.GetParent(); const allObjectClasses = this._runtime.GetAllObjectClasses(); if (pushSol) this._eventSheetManager.PushCleanSol(allObjectClasses); yield*this._includeSheet.DebugRun(); if (pushSol) this._eventSheetManager.PopSol(allObjectClasses) } DebugCanRunFast() { return false } IsActive() { return this._isActive } UpdateActive() { let p = this.GetParent(); while (p) { if (p instanceof C3.EventBlock && p.IsGroup() && !p.IsGroupActive()) { this._isActive = false; return } p = p.GetParent() } this._isActive = true } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; C3.ExpNode = class ExpNode extends C3.DefendedBase { constructor(owner) { super(); this._owner = owner; this._runtime = owner.GetRuntime() } _PostInit() {} static CreateNode(owner, data) { const type = data[0]; const Classes = [BehaviorExpressionNode, ObjectExpressionNode, InstVarExpressionNode, EventVarExpNode, SystemExpressionExpNode, CallFunctionExpressionExpNode]; return C3.New(Classes[type], owner, data) } } ; class SystemExpressionExpNode extends C3.ExpNode { constructor(owner, data) { super(owner); this._systemPlugin = this._runtime.GetSystemPlugin(); this._func = this._runtime.GetObjectReference(data[1]); if (this._func === C3.Plugins.System.Exps.random || this._func === C3.Plugins.System.Exps.choose) this._owner.SetVariesPerInstance() } GetBoundMethod() { return this._systemPlugin._GetBoundACEMethod(this._func, this._systemPlugin) } } class CallFunctionExpressionExpNode extends C3.ExpNode { constructor(owner, data) { super(owner); this._functionBlock = null; this._functionName = data[1]; this._owner.SetVariesPerInstance() } _PostInit() { const eventSheetManager = this._runtime.GetEventSheetManager(); this._functionBlock = eventSheetManager.GetFunctionBlockByName(this._functionName); this._functionName = null; const myEventBlock = this._owner.GetEventBlock(); const callEventBlock = this._functionBlock.GetEventBlock(); this._combinedSolModifiers = [...new Set([...myEventBlock.GetSolModifiersIncludingParents(), ...callEventBlock.GetSolModifiersIncludingParents()])]; this._combinedSolModifiers = eventSheetManager._DeduplicateSolModifierList(this._combinedSolModifiers) } GetBoundMethod() { const functionBlock = this._functionBlock; if (functionBlock.IsEnabled()) { const callEventBlock = functionBlock.GetEventBlock(); return C3.EventBlock.prototype.RunAsExpressionFunctionCall.bind(callEventBlock, this._combinedSolModifiers, functionBlock.GetReturnType(), functionBlock.GetDefaultReturnValue()) } else { const defaultReturnValue = functionBlock.GetDefaultReturnValue(); return ()=>defaultReturnValue } } } function WrapIndex(index, len) { if (index >= len) return index % len; else if (index < 0) { if (index <= -len) index %= len; if (index < 0) index += len; return index } else return index } class ObjectExpressionNode extends C3.ExpNode { constructor(owner, data) { super(owner); this._objectClass = this._runtime.GetObjectClassByIndex(data[1]); this._func = this._runtime.GetObjectReference(data[2]); this._returnsString = !!data[3]; this._eventStack = this._runtime.GetEventSheetManager().GetEventStack(); this._owner._MaybeVaryFor(this._objectClass) } GetBoundMethod() { return this._objectClass.GetPlugin()._GetBoundACEMethod(this._func, this._objectClass.GetSingleGlobalInstance().GetSdkInstance()) } ExpObject(...args) { const objectClass = this._objectClass; const instances = objectClass.GetCurrentSol().GetExpressionInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(this._owner.GetSolIndex(), len); this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass); return this._func.apply(instances[index].GetSdkInstance(), args) } ExpObject_InstExpr(instIndex, ...args) { const objectClass = this._objectClass; const instances = objectClass.GetInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(instIndex, len); this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass); return this._func.apply(instances[index].GetSdkInstance(), args) } } class InstVarExpressionNode extends C3.ExpNode { constructor(owner, data) { super(owner); this._objectClass = this._runtime.GetObjectClassByIndex(data[1]); this._varIndex = data[3]; this._returnsString = !!data[2]; this._owner._MaybeVaryFor(this._objectClass) } ExpInstVar() { const instances = this._objectClass.GetCurrentSol().GetExpressionInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(this._owner.GetSolIndex(), len); return instances[index]._GetInstanceVariableValueUnchecked(this._varIndex) } ExpInstVar_Family() { const objectClass = this._objectClass; const instances = objectClass.GetCurrentSol().GetExpressionInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(this._owner.GetSolIndex(), len); const inst = instances[index]; const offset = inst.GetObjectClass().GetFamilyInstanceVariableOffset(objectClass.GetFamilyIndex()); return inst._GetInstanceVariableValueUnchecked(this._varIndex + offset) } ExpInstVar_InstExpr(instIndex) { const objectClass = this._objectClass; const instances = objectClass.GetInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(instIndex, len); const inst = instances[index]; let offset = 0; if (objectClass.IsFamily()) offset = inst.GetObjectClass().GetFamilyInstanceVariableOffset(objectClass.GetFamilyIndex()); return inst._GetInstanceVariableValueUnchecked(this._varIndex + offset) } } class BehaviorExpressionNode extends C3.ExpNode { constructor(owner, data) { super(owner); this._objectClass = this._runtime.GetObjectClassByIndex(data[1]); this._behaviorType = this._objectClass.GetBehaviorTypeByName(data[2]); this._behaviorIndex = this._objectClass.GetBehaviorIndexByName(data[2]); this._func = this._runtime.GetObjectReference(data[3]); this._returnsString = !!data[4]; this._eventStack = this._runtime.GetEventSheetManager().GetEventStack(); this._owner._MaybeVaryFor(this._objectClass) } ExpBehavior(...args) { const objectClass = this._objectClass; const instances = objectClass.GetCurrentSol().GetExpressionInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(this._owner.GetSolIndex(), len); this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass); const inst = instances[index]; let offset = 0; if (objectClass.IsFamily()) offset = inst.GetObjectClass().GetFamilyBehaviorOffset(objectClass.GetFamilyIndex()); return this._func.apply(inst.GetBehaviorInstances()[this._behaviorIndex + offset].GetSdkInstance(), args) } ExpBehavior_InstExpr(instIndex, ...args) { const objectClass = this._objectClass; const instances = objectClass.GetInstances(); const len = instances.length; if (len === 0) return this._returnsString ? "" : 0; const index = WrapIndex(instIndex, len); this._eventStack.GetCurrentStackFrame().SetExpressionObjectClass(objectClass); const inst = instances[index]; let offset = 0; if (objectClass.IsFamily()) offset = inst.GetObjectClass().GetFamilyBehaviorOffset(objectClass.GetFamilyIndex()); return this._func.apply(inst.GetBehaviorInstances()[this._behaviorIndex + offset].GetSdkInstance(), args) } } class EventVarExpNode extends C3.ExpNode { constructor(owner, data) { super(owner); this._eventVar = null; this._eventVarSid = data[1] } _PostInit() { this._eventVar = this._runtime.GetEventSheetManager().GetEventVariableBySID(this._eventVarSid) } GetVar() { return this._eventVar } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; C3.Parameter = class Parameter extends C3.DefendedBase { constructor(owner, type, index) { super(); this._owner = owner; this._index = index; this._type = type; this.Get = null; this._variesPerInstance = false; this._isConstant = false } static Create(owner, data, index) { const type = data[0]; const Classes = [ExpressionParameter, StringExpressionParameter, FileParameter, ComboParameter, ObjectParameter, LayerExpressionParameter, LayoutParameter, ExpressionParameter, ComboParameter, ComboParameter, InstVarParameter, EventVarParameter, FileParameter, VariadicParameter, StringExpressionParameter, TimelineParameter, BooleanParameter, FunctionParameter, EaseParameter]; return C3.New(Classes[type], owner, type, index, data) } _PostInit() {} SetVariesPerInstance() { this._variesPerInstance = true } _MaybeVaryFor(objectClass) { if (this._variesPerInstance) return; if (!objectClass) return; if (!objectClass.GetPlugin().IsSingleGlobal()) this._variesPerInstance = true } VariesPerInstance() { return this._variesPerInstance } GetIndex() { return this._index } GetRuntime() { return this._owner.GetRuntime() } GetEventBlock() { return this._owner.GetEventBlock() } IsConstant() { return this._isConstant } } ; function GetExpressionFunc(number) { const ret = self.C3_ExpressionFuncs[number]; if (!ret) throw new Error("invalid expression number"); return ret } class ExpressionParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._solIndex = 0; const expData = data[1]; this._expressionNumber = expData[0]; this._numberedNodes = []; this._expressionFunc = null; for (let i = 1, len = expData.length; i < len; ++i) this._numberedNodes.push(C3.ExpNode.CreateNode(this, expData[i])); if (this._numberedNodes.length) this.Get = this.GetExpression; else { this.Get = GetExpressionFunc(this._expressionNumber); this._isConstant = true } } _GetNode(i) { if (i < 0 || i >= this._numberedNodes.length) throw new RangeError("invalid numbered node"); return this._numberedNodes[i] } _PostInit() { for (const node of this._numberedNodes) node._PostInit(); const func = GetExpressionFunc(this._expressionNumber); if (this._numberedNodes.length) this._expressionFunc = func(this); else this._expressionFunc = func } GetSolIndex() { return this._solIndex } GetExpression(solIndex) { this._solIndex = solIndex; return this._expressionFunc() } } class StringExpressionParameter extends ExpressionParameter { constructor(owner, type, index, data) { super(owner, type, index, data); this.Get = this.GetStringExpression; if (type === 14) { this.GetEventBlock().SetAllSolModifiers(); if (this._owner instanceof C3.Action) this.GetEventBlock().SetSolWriterAfterCnds() } } GetStringExpression(solIndex) { this._solIndex = solIndex; const ret = this._expressionFunc(); if (typeof ret === "string") return ret; else return "" } _GetFastTriggerValue() { return GetExpressionFunc(this._expressionNumber)() } } class LayerExpressionParameter extends ExpressionParameter { constructor(owner, type, index, data) { super(owner, type, index, data); this.Get = this.GetLayer; this._isConstant = false } GetLayer(solIndex) { this._solIndex = solIndex; const ret = this._expressionFunc(); const layout = this.GetRuntime().GetCurrentLayout(); return layout.GetLayer(ret) } } class ComboParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._combo = data[1]; this.Get = this.GetCombo; this._isConstant = true } GetCombo() { return this._combo } } class BooleanParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._bool = data[1]; this.Get = this.GetBoolean; this._isConstant = true } GetBoolean() { return this._bool } } class ObjectParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._objectClass = this.GetRuntime().GetObjectClassByIndex(data[1]); this.Get = this.GetObjectClass; const eventBlock = this.GetEventBlock(); eventBlock._AddSolModifier(this._objectClass); if (this._owner instanceof C3.Action) eventBlock.SetSolWriterAfterCnds(); else if (eventBlock.GetParent()) eventBlock.GetParent().SetSolWriterAfterCnds(); this._isConstant = true } GetObjectClass() { return this._objectClass } } class LayoutParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._layout = this.GetRuntime().GetLayoutManager().GetLayoutByName(data[1]); this.Get = this.GetLayout; this._isConstant = true } GetLayout() { return this._layout } } class TimelineParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._timeline = this.GetRuntime().GetTimelineManager().GetTimelineByName(data[1]); this.Get = this.GetTimeline; this._isConstant = true } GetTimeline() { return this._timeline } } class FileParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._fileInfo = data[1]; this.Get = this.GetFile; this._isConstant = true } GetFile() { return this._fileInfo } } class InstVarParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._instVarIndex = data[1]; const ownerObjectClass = this._owner.GetObjectClass(); if (ownerObjectClass && ownerObjectClass.IsFamily()) { this.Get = this.GetFamilyInstanceVariable; this.SetVariesPerInstance() } else { this.Get = this.GetInstanceVariable; this._isConstant = true } } GetInstanceVariable() { return this._instVarIndex } GetFamilyInstanceVariable(solIndex) { solIndex = solIndex || 0; const familyType = this._owner.GetObjectClass(); const sol = familyType.GetCurrentSol(); const instances = sol.GetInstances(); let realType = null; if (instances.length) realType = instances[solIndex % instances.length].GetObjectClass(); else if (sol.HasAnyElseInstances()) { const elseInstances = sol.GetElseInstances(); realType = elseInstances[solIndex % elseInstances.length].GetObjectClass() } else if (familyType.GetInstanceCount() > 0) { const familyInstances = familyType.GetInstances(); realType = familyInstances[solIndex % familyInstances.length].GetObjectClass() } else return 0; return this._instVarIndex + realType.GetFamilyInstanceVariableOffset(familyType.GetFamilyIndex()) } } class EventVarParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._eventVarSid = data[1]; this._eventVar = null; this.Get = this.GetEventVariable; this._isConstant = true } _PostInit() { this._eventVar = this.GetRuntime().GetEventSheetManager().GetEventVariableBySID(this._eventVarSid) } GetEventVariable() { return this._eventVar } } class FunctionParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._functionBlockName = data[1]; this._functionBlock = null; this.Get = this.GetFunction; this._isConstant = true } _PostInit() { this._functionBlock = this.GetRuntime().GetEventSheetManager().GetFunctionBlockByName(this._functionBlockName); this._functionBlockName = null } GetFunction() { return this._functionBlock } } class VariadicParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._subParams = []; this._variadicRet = []; this._isConstant = true; for (let i = 1, len = data.length; i < len; ++i) { const subParam = C3.Parameter.Create(this._owner, data[i], 0); this._subParams.push(subParam); this._variadicRet.push(0); if (!subParam.IsConstant()) this._isConstant = false } this.Get = this.GetVariadic } _PostInit() { for (const subParam of this._subParams) subParam._PostInit() } GetVariadic() { const subParams = this._subParams; const variadicRet = this._variadicRet; for (let i = 0, len = subParams.length; i < len; ++i) variadicRet[i] = subParams[i].Get(0); return variadicRet } } class EaseParameter extends C3.Parameter { constructor(owner, type, index, data) { super(owner, type, index); this._easeIndex = data[1]; this.Get = this.GetEase; this._isConstant = true } GetEase() { return this._easeIndex } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; function EvalParams(parameters, results) { for (let i = 0, len = parameters.length; i < len; ++i) results[i] = parameters[i].Get(0) } const EMPTY_PARAMS_ARRAY = []; const noop = function() {}; C3.Condition = class Condition extends C3.DefendedBase { constructor(eventBlock, data, index) { super(); this._eventBlock = eventBlock; this._runtime = eventBlock.GetRuntime(); this._index = index; this._func = this._runtime.GetObjectReference(data[1]); this._isTrigger = data[3] > 0; this._isFastTrigger = data[3] === 2; this._isLooping = !!data[4]; this._isInverted = !!data[5]; this._isStatic = !!data[6]; this._sid = data[7]; this._isInOrBlock = this._eventBlock.IsOrBlock(); this._objectClass = null; this._behaviorType = null; this._behaviorIndex = -1; this._systemPlugin = null; this.Run = noop; this.DebugRun = noop; this._parameters = []; this._results = []; this._anyParamVariesPerInstance = false; this._savedData = null; this._unsavedData = null; this._debugData = this._runtime.IsDebug() ? { isBreakpoint: data[8][0], canDebug: data[8][1] } : null; if (data[0] === -1) this._systemPlugin = this._runtime.GetSystemPlugin(); else { this._objectClass = this._runtime.GetObjectClassByIndex(data[0]); if (data[2]) { this._behaviorType = this._objectClass.GetBehaviorTypeByName(data[2]); this._behaviorIndex = this._objectClass.GetBehaviorIndexByName(data[2]) } if (this._eventBlock.GetParent()) this._eventBlock.GetParent().SetSolWriterAfterCnds() } if (data.length === 10) { let paramData = data[9]; for (let data of paramData) { this._parameters.push(C3.Parameter.Create(this, data, this._parameters.length)); this._results.push(0) } } if (this._parameters.length === 0) { this._parameters = EMPTY_PARAMS_ARRAY; this._results = EMPTY_PARAMS_ARRAY } this._eventBlock.GetEventSheetManager()._RegisterCondition(this) } static Create(eventBlock, data, index) { return C3.New(C3.Condition, eventBlock, data, index) } _PostInit() { for (const param of this._parameters) { param._PostInit(); if (param.VariesPerInstance()) this._anyParamVariesPerInstance = true } if (this._isFastTrigger) { this.Run = this._RunFastTrigger; this.DebugRun = this._DebugRunFastTrigger } else if (this._systemPlugin) { this._SetSystemRunMethod(); this.DebugRun = this._DebugRunSystem } else if (this._objectClass.GetPlugin().IsSingleGlobal()) { this._SetSingleGlobalRunMethod(); this.DebugRun = this._DebugRunSingleGlobal } else if (this._isStatic) { this.Run = this._RunStatic; this.DebugRun = this._DebugRunStatic } else { this.Run = this._RunObject; this.DebugRun = this._DebugRunObject } } _SetSystemRunMethod() { const plugin = this._systemPlugin; const bindThis = this._systemPlugin; this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSystem) } _SetSingleGlobalRunMethod() { const plugin = this._objectClass.GetPlugin(); const bindThis = this._objectClass.GetSingleGlobalInstance().GetSdkInstance(); this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSingleGlobal) } _SetRunMethodForBoundFunc(plugin, bindThis, fallbackMethod) { const func = this._func; const isInverted = this._isInverted; const parameters = this._parameters; if (parameters.length === 0) { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); if (isInverted) this.Run = function RunSingleCnd_0param() { return C3.xor(boundFunc(), isInverted) } ; else this.Run = boundFunc } else if (parameters.length === 1) { const param0 = parameters[0]; if (!isInverted && param0.IsConstant()) this.Run = plugin._GetBoundACEMethod_1param(func, bindThis, param0.Get(0)); else { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); this.Run = function RunSingleCnd_1param() { return C3.xor(boundFunc(param0.Get(0)), isInverted) } } } else if (parameters.length === 2) { const param0 = parameters[0]; const param1 = parameters[1]; if (!isInverted && param0.IsConstant() && param1.IsConstant()) this.Run = plugin._GetBoundACEMethod_2params(func, bindThis, param0.Get(0), param1.Get(0)); else { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); this.Run = function RunSingleCnd_2params() { return C3.xor(boundFunc(param0.Get(0), param1.Get(0)), isInverted) } } } else if (parameters.length === 3) { const param0 = parameters[0]; const param1 = parameters[1]; const param2 = parameters[2]; if (!isInverted && param0.IsConstant() && param1.IsConstant() && param2.IsConstant()) this.Run = plugin._GetBoundACEMethod_3params(func, bindThis, param0.Get(0), param1.Get(0), param2.Get(0)); else { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); this.Run = function RunSingleCnd_3params() { return C3.xor(boundFunc(param0.Get(0), param1.Get(0), param2.Get(0)), isInverted) } } } else this.Run = fallbackMethod } GetSID() { return this._sid } _GetFunc() { return this._func } GetObjectClass() { return this._objectClass } GetBehaviorType() { return this._behaviorType } GetEventBlock() { return this._eventBlock } GetRuntime() { return this._runtime } GetIndex() { return this._index } GetDebugIndex() { return this.GetIndex() } IsTrigger() { return this._isTrigger } IsFastTrigger() { return this._isFastTrigger } IsInverted() { return this._isInverted } IsLooping() { return this._isLooping } IsBreakpoint() { return this._debugData.isBreakpoint } _SetBreakpoint(b) { this._debugData.isBreakpoint = !!b; this._eventBlock._UpdateCanRunFastRecursive() } _DebugReturnsGenerator() { return this._debugData.canDebug } DebugCanRunFast() { return !this.IsBreakpoint() && !this._runtime.DebugBreakNext() && !this._DebugReturnsGenerator() } GetSavedDataMap() { if (!this._savedData) this._savedData = new Map; return this._savedData } GetUnsavedDataMap() { if (!this._unsavedData) this._unsavedData = new Map; return this._unsavedData } _RunSystem() { const results = this._results; EvalParams(this._parameters, results); return C3.xor(this._func.apply(this._systemPlugin, results), this._isInverted) } *_DebugRunSystem() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; EvalParams(this._parameters, results); let ret = this._func.apply(this._systemPlugin, results); if (C3.IsIterator(ret)) ret = yield*ret; return C3.xor(ret, this._isInverted) } else return this.Run() } _RunSingleGlobal() { const results = this._results; EvalParams(this._parameters, results); const inst = this._objectClass.GetSingleGlobalInstance().GetSdkInstance(); return C3.xor(this._func.apply(inst, results), this._isInverted) } *_DebugRunSingleGlobal() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; EvalParams(this._parameters, results); const inst = this._objectClass.GetSingleGlobalInstance().GetSdkInstance(); let ret = this._func.apply(inst, results); if (C3.IsIterator(ret)) ret = yield*ret; return C3.xor(ret, this._isInverted) } else return this.Run() } _RunFastTrigger() { return true } *_DebugRunFastTrigger() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; return true } _RunStatic() { const results = this._results; EvalParams(this._parameters, results); const ret = this._func.apply(this._behaviorType || this._objectClass, results); this._objectClass.ApplySolToContainer(); return ret } *_DebugRunStatic() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; EvalParams(this._parameters, results); let ret = this._func.apply(this._behaviorType || this._objectClass, results); if (C3.IsIterator(ret)) ret = yield*ret; this._objectClass.ApplySolToContainer(); return ret } else return this.Run() } _RunObject() { const parameters = this._parameters; const results = this._results; const sol = this._objectClass.GetCurrentSol(); for (let i = 0, len = parameters.length; i < len; ++i) { const p = parameters[i]; if (!p.VariesPerInstance()) results[i] = p.Get(0) } if (sol.IsSelectAll()) return this._RunObject_FirstFilter(sol); else return this._RunObject_NextFilter(sol) } *_DebugRunObject() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; return this._RunObject() } _EvaluateVaryingParameters(solIndex) { const parameters = this._parameters; const results = this._results; for (let i = 0, len = parameters.length; i < len; ++i) { const p = parameters[i]; if (p.VariesPerInstance()) results[i] = p.Get(solIndex) } } _RunObject_FirstFilter(sol) { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const behaviorIndex = this._behaviorIndex; const isBehavior = behaviorIndex >= 0; const allInstances = objectClass.GetInstances(); const paramsVary = this._anyParamVariesPerInstance; const results = this._results; const func = this._func; const isInverted = this._isInverted; const isInOrBlock = this._isInOrBlock && !this._isTrigger; sol.ClearArrays(); for (let i = 0, len = allInstances.length; i < len; ++i) { const inst = allInstances[i]; if (paramsVary) this._EvaluateVaryingParameters(i); let ret; if (isBehavior) { const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; ret = func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results) } else ret = func.apply(inst.GetSdkInstance(), results); if (C3.xor(ret, isInverted)) sol._PushInstance(inst); else if (isInOrBlock) sol._PushElseInstance(inst) } objectClass.FinishCondition(true); sol._SetSelectAll(false); objectClass.ApplySolToContainer(); return sol.HasAnyInstances() } _RunObject_NextFilter(sol) { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const isInContainer = objectClass.IsInContainer(); const behaviorIndex = this._behaviorIndex; const isBehavior = behaviorIndex >= 0; const paramsVary = this._anyParamVariesPerInstance; const results = this._results; const func = this._func; const isInverted = this._isInverted; const isInOrBlock = this._isInOrBlock && !this._isTrigger; const solInstances = sol._GetOwnInstances(); const solElseInstances = sol._GetOwnElseInstances(); const isUsingElseInstances = isInOrBlock && !this._eventBlock.IsFirstConditionOfType(this); const arr = isUsingElseInstances ? solElseInstances : solInstances; let k = 0; let isAnyTrue = false; for (let i = 0, len = arr.length; i < len; ++i) { const inst = arr[i]; if (paramsVary) this._EvaluateVaryingParameters(i); let ret; if (isBehavior) { const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; ret = func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results) } else ret = func.apply(inst.GetSdkInstance(), results); if (C3.xor(ret, isInverted)) { isAnyTrue = true; if (isUsingElseInstances) { solInstances.push(inst); if (isInContainer) inst._PushSiblingsToSolInstances() } else { arr[k] = inst; if (isInContainer) inst._SetSiblingsToSolInstancesIndex(k); ++k } } else if (isUsingElseInstances) { arr[k] = inst; if (isInContainer) inst._SetSiblingsToSolElseInstancesIndex(k); ++k } else if (isInOrBlock) { solElseInstances.push(inst); if (isInContainer) inst._PushSiblingsToSolElseInstances() } } C3.truncateArray(arr, k); if (isInContainer) objectClass._TruncateContainerSols(isUsingElseInstances, k); const pickInFinish = isAnyTrue; if (isUsingElseInstances && !isAnyTrue) isAnyTrue = this._OrBlockCheckInstances(solInstances); objectClass.FinishCondition(pickInFinish || isInOrBlock); return isInOrBlock ? isAnyTrue : sol.HasAnyInstances() } _OrBlockCheckInstances(solInstances) { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const paramsVary = this._anyParamVariesPerInstance; const behaviorIndex = this._behaviorIndex; const isBehavior = behaviorIndex >= 0; const results = this._results; const func = this._func; const isInverted = this._isInverted; for (let i = 0, len = solInstances.length; i < len; ++i) { const inst = solInstances[i]; if (paramsVary) this._EvaluateVaryingParameters(i); let ret; if (isBehavior) { const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; ret = func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results) } else ret = func.apply(inst.GetSdkInstance(), results); if (C3.xor(ret, isInverted)) return true } return false } ReevaluateParameter(paramIndex, solIndex) { return this._parameters[paramIndex].Get(solIndex) } GetFastTriggerValue() { const parameters = this._parameters; if (!parameters.length) throw new Error("no parameters"); return parameters[0]._GetFastTriggerValue() } _SaveToJson() { if (!this._savedData || !this._savedData.size) return null; const ex = {}; for (const [k,v] of this._savedData.entries()) { let saveVal = v; if (k === "collmemory") saveVal = [...v.entries()].map(arr=>[arr[0].GetUID(), arr[1].GetUID(), arr[2]]); ex[k] = saveVal } return { "ex": ex } } _LoadFromJson(o) { if (this._savedData) { this._savedData.clear(); this._savedData = null } if (!o) return; const runtime = this._runtime; const ex = o["ex"]; if (ex) { const map = this.GetSavedDataMap(); map.clear(); for (const [k,v] of Object.entries(ex)) { let loadVal = v; if (k === "collmemory") loadVal = C3.New(C3.PairMap, v.map(arr=>[runtime.GetInstanceByUID(arr[0]), runtime.GetInstanceByUID(arr[1]), arr[2]]).filter(arr=>arr[0] && arr[1])); map.set(k, loadVal) } } } } } ;'use strict'; { const C3 = self.C3; const assert = self.assert; function EvalParams(parameters, results) { for (let i = 0, len = parameters.length; i < len; ++i) results[i] = parameters[i].Get(0) } const EMPTY_PARAMS_ARRAY = []; const noop = function() {}; const noopGenerator = function*() {}; C3.Action = class Action extends C3.DefendedBase { constructor(eventBlock, data, index) { super(); this._eventBlock = eventBlock; const runtime = eventBlock.GetRuntime(); this._runtime = runtime; this._index = index; this._sid = data.length >= 4 ? data[3] : -1; this._actionReturnType = data.length >= 5 ? data[4] : 0; this._func = null; this._objectClass = null; this._behaviorType = null; this._behaviorIndex = -1; this._systemPlugin = null; this._callFunctionName = ""; this._callEventBlock = null; this._combinedSolModifiers = null; this.Run = noop; this.DebugRun = noop; this._parameters = []; this._results = []; this._anyParamVariesPerInstance = false; this._savedData = null; this._unsavedData = null; const isScript = data[0] === -3; const debugInfo = isScript ? data[2] : data[5]; this._debugData = runtime.IsDebug() || isScript ? { isBreakpoint: debugInfo[0], canDebug: debugInfo[1], index: debugInfo[2] } : null; if (data[0] === -1) { this._systemPlugin = runtime.GetSystemPlugin(); this._func = runtime.GetObjectReference(data[1]) } else if (data[0] === -2) this._callFunctionName = data[1]; else if (isScript) { const userMethod = runtime.GetObjectReference(data[1]); this._func = userMethod; this.Run = this.RunUserScript; this.DebugRun = this.DebugRunUserScript; this._actionReturnType = 1 } else { this._func = runtime.GetObjectReference(data[1]); this._objectClass = runtime.GetObjectClassByIndex(data[0]); if (data[2]) { this._behaviorType = this._objectClass.GetBehaviorTypeByName(data[2]); this._behaviorIndex = this._objectClass.GetBehaviorIndexByName(data[2]) } } if (data.length === 7) { const paramData = data[6]; for (const data of paramData) { this._parameters.push(C3.Parameter.Create(this, data, this._parameters.length)); this._results.push(0) } } if (this._parameters.length === 0) { this._parameters = EMPTY_PARAMS_ARRAY; this._results = EMPTY_PARAMS_ARRAY } this._eventBlock.GetEventSheetManager()._RegisterAction(this) } static Create(eventBlock, data, index) { return C3.New(C3.Action, eventBlock, data, index) } _PostInit() { for (const param of this._parameters) { param._PostInit(); if (param.VariesPerInstance()) this._anyParamVariesPerInstance = true } if (this._systemPlugin) { this._SetSystemRunMethod(); this.DebugRun = this._DebugRunSystem } else if (this._callFunctionName) { this._SetCallFunctionRunMethod(); this._callFunctionName = "" } else if (this.Run === this.RunUserScript) { const userMethod = this._func; const localVars = this._runtime.GetEventSheetManager()._GetLocalVariablesScriptInterface(this._eventBlock); this._func = userMethod.bind(null, this._runtime.GetIRuntime(), localVars) } else if (this._behaviorType) if (this.IsAsync()) { this.Run = this._RunBehavior_Async; this.DebugRun = this._DebugRunBehavior_Async } else { this.Run = this._RunBehavior; this.DebugRun = this._DebugRunBehavior } else if (this._objectClass.GetPlugin().IsSingleGlobal()) { this._SetSingleGlobalRunMethod(); this.DebugRun = this._DebugRunSingleGlobal } else if (this.IsAsync()) { this.Run = this._RunObject_Async; this.DebugRun = this._DebugRunObject_Async } else if (!this._parameters.length) { this.Run = this._RunObject_ParamsConst; this.DebugRun = this._DebugRunObject_ParamsConst } else if (this._parameters.every(p=>p.VariesPerInstance())) { this.Run = this._RunObject_AllParamsVary; this.DebugRun = this._DebugRunObject_AllParamsVary } else if (this._anyParamVariesPerInstance) { this.Run = this._RunObject_SomeParamsVary; this.DebugRun = this._DebugRunObject_SomeParamsVary } else if (this._parameters.every(p=>p.IsConstant())) { EvalParams(this._parameters, this._results); this.Run = this._RunObject_ParamsConst; this.DebugRun = this._DebugRunObject_ParamsConst } else { this.Run = this._RunObject_ParamsDontVary; this.DebugRun = this._DebugRunObject_ParamsDontVary } } _SetSystemRunMethod() { const plugin = this._systemPlugin; const bindThis = this._systemPlugin; this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSystem) } _SetSingleGlobalRunMethod() { const plugin = this._objectClass.GetPlugin(); const bindThis = this._objectClass.GetSingleGlobalInstance().GetSdkInstance(); this._SetRunMethodForBoundFunc(plugin, bindThis, this._RunSingleGlobal) } _SetCallFunctionRunMethod() { const eventSheetManager = this._eventBlock.GetEventSheetManager(); const functionBlock = eventSheetManager.GetFunctionBlockByName(this._callFunctionName); if (functionBlock.IsEnabled()) { this._callEventBlock = functionBlock.GetEventBlock(); this._combinedSolModifiers = [...new Set([...this._eventBlock.GetSolModifiersIncludingParents(), ...this._callEventBlock.GetSolModifiersIncludingParents()])]; this._combinedSolModifiers = eventSheetManager._DeduplicateSolModifierList(this._combinedSolModifiers); this.Run = C3.EventBlock.prototype.RunAsFunctionCall.bind(this._callEventBlock, this._combinedSolModifiers, this._parameters); this.DebugRun = this._DebugRunCallFunction } else { this.Run = noop; this.DebugRun = noopGenerator } } _SetRunMethodForBoundFunc(plugin, bindThis, fallbackMethod) { const func = this._func; const parameters = this._parameters; if (parameters.length === 0) this.Run = plugin._GetBoundACEMethod(func, bindThis); else if (parameters.length === 1) { const param0 = parameters[0]; if (param0.IsConstant()) this.Run = plugin._GetBoundACEMethod_1param(func, bindThis, param0.Get(0)); else { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); this.Run = function RunSingleAct_1param() { return boundFunc(param0.Get(0)) } } } else if (parameters.length === 2) { const param0 = parameters[0]; const param1 = parameters[1]; if (param0.IsConstant() && param1.IsConstant()) this.Run = plugin._GetBoundACEMethod_2params(func, bindThis, param0.Get(0), param1.Get(0)); else { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); this.Run = function RunSingleAct_2params() { return boundFunc(param0.Get(0), param1.Get(0)) } } } else if (parameters.length === 3) { const param0 = parameters[0]; const param1 = parameters[1]; const param2 = parameters[2]; if (param0.IsConstant() && param1.IsConstant() && param2.IsConstant()) this.Run = plugin._GetBoundACEMethod_3params(func, bindThis, param0.Get(0), param1.Get(0), param2.Get(0)); else { const boundFunc = plugin._GetBoundACEMethod(func, bindThis); this.Run = function RunSingleAct_3params() { return boundFunc(param0.Get(0), param1.Get(0), param2.Get(0)) } } } else this.Run = fallbackMethod } GetSID() { return this._sid } IsAsync() { return this._actionReturnType === 1 } CanBailOut() { return this._actionReturnType === 2 } HasReturnType() { return this._actionReturnType !== 0 } GetObjectClass() { return this._objectClass } GetEventBlock() { return this._eventBlock } GetRuntime() { return this._runtime } GetIndex() { return this._index } GetDebugIndex() { return this._debugData.index } GetCombinedSolModifiers() { return this._combinedSolModifiers } IsBreakpoint() { return this._debugData.isBreakpoint } _SetBreakpoint(b) { this._debugData.isBreakpoint = !!b; this._eventBlock._UpdateCanRunFastRecursive() } _DebugReturnsGenerator() { return this._debugData.canDebug } DebugCanRunFast() { return !this.IsBreakpoint() && !this._runtime.DebugBreakNext() && !this._DebugReturnsGenerator() } GetSavedDataMap() { if (!this._savedData) this._savedData = new Map; return this._savedData } GetUnsavedDataMap() { if (!this._unsavedData) this._unsavedData = new Map; return this._unsavedData } _RunSystem() { const results = this._results; EvalParams(this._parameters, results); return this._func.apply(this._systemPlugin, results) } *_DebugRunSystem() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; EvalParams(this._parameters, results); const ret = yield*this._func.apply(this._systemPlugin, results); return ret } else return this.Run() } *_DebugRunCallFunction() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; const ret = yield*this._callEventBlock.DebugRunAsFunctionCall(this._combinedSolModifiers, this._parameters); return ret } _RunSingleGlobal() { const results = this._results; EvalParams(this._parameters, results); return this._func.apply(this._objectClass.GetSingleGlobalInstance().GetSdkInstance(), results) } *_DebugRunSingleGlobal() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; EvalParams(this._parameters, results); const ret = yield*this._func.apply(this._objectClass.GetSingleGlobalInstance().GetSdkInstance(), results); return ret } else return this.Run() } _RunObject_ParamsConst() { const results = this._results; const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) this._func.apply(instances[i].GetSdkInstance(), results) } *_DebugRunObject_ParamsConst() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) yield*this._func.apply(instances[i].GetSdkInstance(), results) } else this._RunObject_ParamsConst() } _RunObject_ParamsDontVary() { const results = this._results; EvalParams(this._parameters, results); const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) this._func.apply(instances[i].GetSdkInstance(), results) } *_DebugRunObject_ParamsDontVary() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const results = this._results; EvalParams(this._parameters, results); const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) yield*this._func.apply(instances[i].GetSdkInstance(), results) } else this._RunObject_ParamsDontVary() } _RunObject_AllParamsVary() { const parameters = this._parameters; const results = this._results; const func = this._func; const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) results[j] = parameters[j].Get(i); func.apply(inst.GetSdkInstance(), results) } } *_DebugRunObject_AllParamsVary() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const parameters = this._parameters; const results = this._results; const func = this._func; const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) results[j] = parameters[j].Get(i); yield*func.apply(inst.GetSdkInstance(), results) } } else this._RunObject_AllParamsVary() } _RunObject_SomeParamsVary() { const parameters = this._parameters; const results = this._results; const func = this._func; const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = parameters.length; i < len; ++i) { const p = parameters[i]; if (!p.VariesPerInstance()) results[i] = p.Get(0) } for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) { const p = parameters[j]; if (p.VariesPerInstance()) results[j] = p.Get(i) } func.apply(inst.GetSdkInstance(), results) } } *_DebugRunObject_SomeParamsVary() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const parameters = this._parameters; const results = this._results; const func = this._func; const instances = this._objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = parameters.length; i < len; ++i) { const p = parameters[i]; if (!p.VariesPerInstance()) results[i] = p.Get(0) } for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) { const p = parameters[j]; if (p.VariesPerInstance()) results[j] = p.Get(i) } yield*func.apply(inst.GetSdkInstance(), results) } } else this._RunObject_SomeParamsVary() } _RunBehavior() { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const parameters = this._parameters; const paramsVary = this._anyParamVariesPerInstance; const results = this._results; const func = this._func; const behaviorIndex = this._behaviorIndex; const instances = objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = parameters.length; i < len; ++i) { const p = parameters[i]; if (!p.VariesPerInstance()) results[i] = p.Get(0) } for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; if (paramsVary) for (let j = 0, lenj = parameters.length; j < lenj; ++j) { const p = parameters[j]; if (p.VariesPerInstance()) results[j] = p.Get(i) } const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results) } } *_DebugRunBehavior() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const parameters = this._parameters; const paramsVary = this._anyParamVariesPerInstance; const results = this._results; const func = this._func; const behaviorIndex = this._behaviorIndex; const instances = objectClass.GetCurrentSol().GetInstances(); for (let i = 0, len = parameters.length; i < len; ++i) { const p = parameters[i]; if (!p.VariesPerInstance()) results[i] = p.Get(0) } for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; if (paramsVary) for (let j = 0, lenj = parameters.length; j < lenj; ++j) { const p = parameters[j]; if (p.VariesPerInstance()) results[j] = p.Get(i) } const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; yield*func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results) } } else this._RunBehavior() } _RunObject_Async() { const parameters = this._parameters; const results = this._results; const func = this._func; const instances = this._objectClass.GetCurrentSol().GetInstances(); const promises = []; for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) results[j] = parameters[j].Get(i); promises.push(func.apply(inst.GetSdkInstance(), results)) } return Promise.all(promises) } *_DebugRunObject_Async() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const parameters = this._parameters; const results = this._results; const func = this._func; const instances = this._objectClass.GetCurrentSol().GetInstances(); const promises = []; for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) results[j] = parameters[j].Get(i); promises.push(yield*func.apply(inst.GetSdkInstance(), results)) } return Promise.all(promises) } else return this._RunObject_Async() } _RunBehavior_Async() { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const parameters = this._parameters; const results = this._results; const func = this._func; const behaviorIndex = this._behaviorIndex; const instances = objectClass.GetCurrentSol().GetInstances(); const promises = []; for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) results[j] = parameters[j].Get(i); const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; promises.push(func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)) } return Promise.all(promises) } *_DebugRunBehavior_Async() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; if (this._DebugReturnsGenerator()) { const objectClass = this._objectClass; const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); const parameters = this._parameters; const results = this._results; const func = this._func; const behaviorIndex = this._behaviorIndex; const instances = objectClass.GetCurrentSol().GetInstances(); const promises = []; for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; for (let j = 0, lenj = parameters.length; j < lenj; ++j) results[j] = parameters[j].Get(i); const offset = isFamily ? inst.GetObjectClass().GetFamilyBehaviorOffset(familyIndex) : 0; promises.push(yield*func.apply(inst.GetBehaviorInstances()[behaviorIndex + offset].GetSdkInstance(), results)) } return Promise.all(promises) } else return this._RunBehavior_Async() } async RunUserScript() { try { await this._func() } catch (err) { console.error(`Unhandled exception running script %c${this._eventBlock.GetEventSheet().GetName()}, event ${this._eventBlock.GetDisplayNumber()}, action ${this.GetDebugIndex() + 1}:`, "font-size: 1.2em; font-weight: bold;", err); if (self.C3Debugger) self.C3Debugger._SetLastErrorScript(this); if (!C3.EventScript.HadUserScriptException()) { console.info(`%cTip:%c run this to highlight in Construct the last script that had an error: %cgoToLastErrorScript()`, "font-weight: bold; text-decoration: underline", "", "font-weight: bold"); C3.EventScript.SetHadUserScriptException() } } } *DebugRunUserScript() { if (this.IsBreakpoint() || this._runtime.DebugBreakNext()) yield this; return this.RunUserScript() } _SaveToJson() { if (!this._savedData || !this._savedData.size) return null; return { "ex": C3.ToSuperJSON(this._savedData) } } _LoadFromJson(o) { if (this._savedData) { this._savedData.clear(); this._savedData = null } if (!o) return; const ex = o["ex"]; if (ex) this._savedData = C3.FromSuperJSON(ex) } } } ;'use strict'; { const C3 = self.C3; const tempColor = new C3.Color; function CompareX(cmp, x) { return C3.compare(this.GetWorldInfo().GetX(), cmp, x) } function CompareY(cmp, y) { return C3.compare(this.GetWorldInfo().GetY(), cmp, y) } function IsOnScreen() { const wi = this.GetWorldInfo(); return wi.IsInViewport(wi.GetLayer().GetViewport()) } function IsOutsideLayout() { const wi = this.GetWorldInfo(); const layout = wi.GetLayout(); const bbox = wi.GetBoundingBox(); return bbox.getRight() < 0 || bbox.getBottom() < 0 || bbox.getLeft() > layout.GetWidth() || bbox.getTop() > layout.GetHeight() } function PickDistance(which, x, y) { const sol = this.GetCurrentSol(); const instances = sol.GetInstances(); if (!instances.length) return false; let inst = instances[0]; let wi = inst.GetWorldInfo(); let pickme = inst; let dist2 = C3.distanceSquared(wi.GetX(), wi.GetY(), x, y); for (let i = 1, len = instances.length; i < len; ++i) { inst = instances[i]; wi = inst.GetWorldInfo(); const d2 = C3.distanceSquared(wi.GetX(), wi.GetY(), x, y); if (which === 0 && d2 < dist2 || which === 1 && d2 > dist2) { dist2 = d2; pickme = inst } } sol.PickOne(pickme); return true } function SetX(x) { const wi = this.GetWorldInfo(); if (wi.GetX() === x) return; wi.SetX(x); wi.SetBboxChanged() } function SetY(y) { const wi = this.GetWorldInfo(); if (wi.GetY() === y) return; wi.SetY(y); wi.SetBboxChanged() } function SetPos(x, y) { const wi = this.GetWorldInfo(); if (wi.EqualsXY(x, y)) return; wi.SetXY(x, y); wi.SetBboxChanged() } function SetPosToObject(objectClass, imgPt) { if (!objectClass) return; const inst = objectClass.GetPairedInstance(this._inst); if (!inst) return; const [x,y] = inst.GetImagePoint(imgPt); const wi = this.GetWorldInfo(); if (wi.GetX() === x && wi.GetY() === y) return; wi.SetXY(x, y); wi.SetBboxChanged() } function MoveForward(dist) { if (dist === 0) return; const wi = this.GetWorldInfo(); wi.OffsetXY(wi.GetCosAngle() * dist, wi.GetSinAngle() * dist); wi.SetBboxChanged() } function MoveAtAngle(a, dist) { if (dist === 0) return; const wi = this.GetWorldInfo(); a = C3.toRadians(a); wi.OffsetXY(Math.cos(a) * dist, Math.sin(a) * dist); wi.SetBboxChanged() } function GetX() { return this.GetWorldInfo().GetX() } function GetY() { return this.GetWorldInfo().GetY() } function GetDt() { return this._runtime.GetDt(this._inst) } function CompareWidth(cmp, w) { return C3.compare(this.GetWorldInfo().GetWidth(), cmp, w) } function CompareHeight(cmp, h) { return C3.compare(this.GetWorldInfo().GetHeight(), cmp, h) } function SetWidth(w) { const wi = this.GetWorldInfo(); if (wi.GetWidth() === w) return; wi.SetWidth(w); wi.SetBboxChanged() } function SetHeight(h) { const wi = this.GetWorldInfo(); if (wi.GetHeight() === h) return; wi.SetHeight(h); wi.SetBboxChanged() } function SetSize(w, h) { const wi = this.GetWorldInfo(); if (wi.GetWidth() === w && wi.GetHeight() === h) return; wi.SetSize(w, h); wi.SetBboxChanged() } function GetWidth() { return this.GetWorldInfo().GetWidth() } function GetHeight() { return this.GetWorldInfo().GetHeight() } function GetBboxLeft() { return this.GetWorldInfo().GetBoundingBox().getLeft() } function GetBboxTop() { return this.GetWorldInfo().GetBoundingBox().getTop() } function GetBboxRight() { return this.GetWorldInfo().GetBoundingBox().getRight() } function GetBboxBottom() { return this.GetWorldInfo().GetBoundingBox().getBottom() } function IsAngleWithin(within, a) { return C3.angleDiff(this.GetWorldInfo().GetAngle(), C3.toRadians(a)) <= C3.toRadians(within) } function IsAngleClockwiseFrom(a) { return C3.angleClockwise(this.GetWorldInfo().GetAngle(), C3.toRadians(a)) } function IsBetweenAngles(a, b) { const lower = C3.toRadians(a); const upper = C3.toRadians(b); const angle = this.GetWorldInfo().GetAngle(); const obtuse = !C3.angleClockwise(upper, lower); if (obtuse) return !(!C3.angleClockwise(angle, lower) && C3.angleClockwise(angle, upper)); else return C3.angleClockwise(angle, lower) && !C3.angleClockwise(angle, upper) } function SetAngle(a) { const wi = this.GetWorldInfo(); const newAngle = C3.clampAngle(C3.toRadians(a)); if (isNaN(newAngle) || wi.GetAngle() === newAngle) return; wi.SetAngle(newAngle); wi.SetBboxChanged() } function RotateClockwise(a) { if (isNaN(a) || a === 0) return; const wi = this.GetWorldInfo(); wi.SetAngle(wi.GetAngle() + C3.toRadians(a)); wi.SetBboxChanged() } function RotateCounterclockwise(a) { if (isNaN(a) || a === 0) return; const wi = this.GetWorldInfo(); wi.SetAngle(wi.GetAngle() - C3.toRadians(a)); wi.SetBboxChanged() } function RotateTowardAngle(amt, target) { const wi = this.GetWorldInfo(); const a = wi.GetAngle(); const newAngle = C3.angleRotate(a, C3.toRadians(target), C3.toRadians(amt)); if (isNaN(newAngle) || a === newAngle) return; wi.SetAngle(newAngle); wi.SetBboxChanged() } function RotateTowardPosition(amt, x, y) { const wi = this.GetWorldInfo(); const a = wi.GetAngle(); const dx = x - wi.GetX(); const dy = y - wi.GetY(); const target = Math.atan2(dy, dx); const newAngle = C3.angleRotate(a, target, C3.toRadians(amt)); if (isNaN(newAngle) || a === newAngle) return; wi.SetAngle(newAngle); wi.SetBboxChanged() } function SetTowardPosition(x, y) { const wi = this.GetWorldInfo(); const a = wi.GetAngle(); const dx = x - wi.GetX(); const dy = y - wi.GetY(); const newAngle = Math.atan2(dy, dx); if (isNaN(newAngle) || a === newAngle) return; wi.SetAngle(newAngle); wi.SetBboxChanged() } function GetAngle() { return C3.toDegrees(this.GetWorldInfo().GetAngle()) } function CompareOpacity(cmp, x) { return C3.compare(C3.round6dp(this.GetWorldInfo().GetOpacity() * 100), cmp, x) } function IsVisible() { return this.GetWorldInfo().IsVisible() } function SetVisible(v) { const wi = this.GetWorldInfo(); if (v === 2) v = !wi.IsVisible(); else v = v !== 0; if (wi.IsVisible() === v) return; wi.SetVisible(v); this._runtime.UpdateRender() } function SetOpacity(o) { const newOpacity = C3.clamp(o / 100, 0, 1); const wi = this.GetWorldInfo(); if (wi.GetOpacity() === newOpacity) return; wi.SetOpacity(newOpacity); this._runtime.UpdateRender() } function SetDefaultColor(rgb) { tempColor.setFromRgbValue(rgb); const wi = this.GetWorldInfo(); if (wi.GetUnpremultipliedColor().equalsIgnoringAlpha(tempColor)) return; wi.SetUnpremultipliedColor(tempColor); this._runtime.UpdateRender() } function GetColor() { const c = this.GetWorldInfo().GetUnpremultipliedColor(); return C3.PackRGBAEx(c.getR(), c.getG(), c.getB(), c.getA()) } function GetOpacity() { return C3.round6dp(this.GetWorldInfo().GetOpacity() * 100) } function IsOnLayer(layer) { if (!layer) return false; return this.GetWorldInfo().GetLayer() === layer } function PickTopBottom(which) { const sol = this.GetCurrentSol(); const instances = sol.GetInstances(); if (!instances.length) return false; let inst = instances[0]; let pickme = inst; for (let i = 1, len = instances.length; i < len; ++i) { const inst = instances[i]; const instWi = inst.GetWorldInfo(); const pickmeWi = pickme.GetWorldInfo(); const instLayerIndex = instWi.GetLayer().GetIndex(); const pickmeLayerIndex = pickmeWi.GetLayer().GetIndex(); if (which === 0) { if (instLayerIndex > pickmeLayerIndex || instLayerIndex === pickmeLayerIndex && instWi.GetZIndex() > pickmeWi.GetZIndex()) pickme = inst } else if (instLayerIndex < pickmeLayerIndex || instLayerIndex === pickmeLayerIndex && instWi.GetZIndex() < pickmeWi.GetZIndex()) pickme = inst } sol.PickOne(pickme); return true } function CompareZElevation(which, cmp, value) { const wi = this.GetWorldInfo(); const z = which === 0 ? wi.GetZElevation() : wi.GetTotalZElevation(); return C3.compare(z, cmp, value) } function MoveToTop() { this.GetWorldInfo().ZOrderMoveToTop() } function MoveToBottom() { this.GetWorldInfo().ZOrderMoveToBottom() } function MoveToLayer(layerMove) { if (!layerMove) return; this.GetWorldInfo().ZOrderMoveToLayer(layerMove) } function ZMoveToObject(where, objectClass) { const isAfter = where === 0; if (!objectClass) return; const otherInst = objectClass.GetFirstPicked(this.GetInstance()); if (!otherInst) return; this.GetWorldInfo().ZOrderMoveAdjacentToInstance(otherInst, isAfter) } function SetZElevation(z) { const wi = this.GetWorldInfo(); if (wi.GetZElevation() === z) return; wi.SetZElevation(z); this._runtime.UpdateRender() } function LayerNumber() { return this.GetWorldInfo().GetLayer().GetIndex() } function LayerName() { return this.GetWorldInfo().GetLayer().GetName() } function ZIndex() { return this.GetWorldInfo().GetZIndex() } function ZElevation() { return this.GetWorldInfo().GetZElevation() } function TotalZElevation() { return this.GetWorldInfo().GetTotalZElevation() } function SetEffectEnabled(enabled, effectName) { const effectType = this.GetObjectClass().GetEffectList().GetEffectTypeByName(effectName); if (!effectType) return; const effectTypeIndex = effectType.GetIndex(); const e = enabled === 1; const instFxList = this.GetWorldInfo().GetInstanceEffectList(); if (instFxList.IsEffectIndexActive(effectTypeIndex) === e) return; instFxList.SetEffectIndexActive(effectTypeIndex, e); instFxList.UpdateActiveEffects(); this._runtime.UpdateRender() } function SetEffectParam(effectName, paramIndex, value) { const effectType = this.GetObjectClass().GetEffectList().GetEffectTypeByName(effectName); if (!effectType) return; const effectTypeIndex = effectType.GetIndex(); const instFxList = this.GetWorldInfo().GetInstanceEffectList(); const paramsArr = instFxList.GetEffectParametersForIndex(effectTypeIndex); paramIndex = Math.floor(paramIndex); if (paramIndex < 0 || paramIndex >= paramsArr.length) return; const paramType = effectType.GetShaderProgram().GetParameterType(paramIndex); if (paramType === "color") { tempColor.setFromRgbValue(value); const curColor = paramsArr[paramIndex]; if (tempColor.equalsIgnoringAlpha(curColor)) return; curColor.copyRgb(tempColor) } else { if (paramType === "percent") value /= 100; if (paramsArr[paramIndex] === value) return; paramsArr[paramIndex] = value } if (instFxList.IsEffectIndexActive(effectTypeIndex)) this._runtime.UpdateRender() } function HasParent() { return this.GetWorldInfo().HasParent() } function HasChildren() { return this.GetWorldInfo().HasChildren() } function PickParent(parentObjectClass, which) { const mySol = this.GetCurrentSol(); const myInstances = mySol.GetInstances(); if (myInstances.length === 0) return false; const parentSol = parentObjectClass.GetCurrentSol(); const parentInstances = parentSol.GetInstances(); if (parentInstances.length === 0) return false; const parentInstancesSet = new Set(parentInstances); const pickParents = new Set; for (let i = 0, len = myInstances.length; i < len; ++i) { const myInst = myInstances[i]; if (which === 1) for (const parentInst of myInst.parents()) { if (parentInst.BelongsToObjectClass(parentObjectClass) && parentInstancesSet.has(parentInst)) pickParents.add(parentInst) } else { let parentInst; if (which === 0) { parentInst = myInst.GetParent(); if (parentInst === null) continue } else parentInst = myInst.GetTopParent(); if (parentInst.BelongsToObjectClass(parentObjectClass) && parentInstancesSet.has(parentInst)) pickParents.add(parentInst) } } if (pickParents.size === 0) return false; parentSol.SetSetPicked(pickParents); parentObjectClass.ApplySolToContainer(); return true } function PickChildren(childObjectClass, which) { const mySol = this.GetCurrentSol(); const myInstances = mySol.GetInstances(); if (myInstances.length === 0) return false; const childSol = childObjectClass.GetCurrentSol(); const childInstances = childSol.GetInstances(); if (childInstances.length === 0) return false; const childInstancesSet = new Set(childInstances); const pickChildren = new Set; for (let i = 0, len = myInstances.length; i < len; ++i) { const myInst = myInstances[i]; if (which === 2 && !myInst.HasChildren() && myInst.BelongsToObjectClass(childObjectClass) && childInstancesSet.has(myInst)) pickChildren.add(myInst); for (const childInst of which === 0 ? myInst.children() : myInst.allChildren()) { if (which === 2 && childInst.HasChildren()) continue; if (childInst.BelongsToObjectClass(childObjectClass) && childInstancesSet.has(childInst)) pickChildren.add(childInst) } } if (pickChildren.size === 0) return false; childSol.SetSetPicked(pickChildren); childObjectClass.ApplySolToContainer(); return true } function PickNthChild(childObjectClass, index) { const mySol = this.GetCurrentSol(); const myInstances = mySol.GetInstances(); if (myInstances.length === 0) return false; const childSol = childObjectClass.GetCurrentSol(); const childInstances = childSol.GetInstances(); if (childInstances.length === 0) return false; const childInstancesSet = new Set(childInstances); const pickChildren = []; for (let i = 0, len = myInstances.length; i < len; ++i) { const myInst = myInstances[i]; const childInst = myInst.GetChildAt(index); if (childInst !== null && childInst.BelongsToObjectClass(childObjectClass) && childInstancesSet.has(childInst)) pickChildren.push(childInst) } if (pickChildren.length === 0) return false; childSol.SetArrayPicked(pickChildren); childObjectClass.ApplySolToContainer(); return true } function CompareChildCount(cmp, count) { return C3.compare(this._inst.GetChildCount(), cmp, count) } function AddChild(childObjectClass, transformX, transformY, transformWidth, transformHeight, transformAngle, transformZElevation, destroyWithParent) { const inst = this._inst; const actObjectClass = this._runtime.GetCurrentAction().GetObjectClass(); for (const child of childObjectClass.allCorrespondingInstances(inst, actObjectClass)) { if (!child.GetPlugin().SupportsSceneGraph()) return; inst.AddChild(child, { transformX, transformY, transformWidth, transformHeight, transformAngle, transformZElevation, destroyWithParent }) } } function RemoveChild(childObjectClass) { const inst = this._inst; const actObjectClass = this._runtime.GetCurrentAction().GetObjectClass(); for (const child of childObjectClass.allCorrespondingInstances(inst, actObjectClass)) inst.RemoveChild(child) } function RemoveFromParent() { if (!this._inst.HasParent()) return; const parent = this._inst.GetParent(); parent.RemoveChild(this._inst) } function ChildCount() { return this._inst.GetChildCount() } function SetMeshSize(cols, rows) { cols = Math.floor(cols); rows = Math.floor(rows); const wi = this.GetWorldInfo(); if (cols < 2 || rows < 2 || !isFinite(cols) || !isFinite(rows)) { wi.ReleaseMesh(); wi.SetBboxChanged() } else wi.CreateMesh(cols, rows) } function SetMeshPoint(col, row, mode, posx, posy, texu, texv) { const wi = this.GetWorldInfo(); const didBboxChange = wi.SetMeshPoint(col, row, { mode: mode === 0 ? "absolute" : "relative", x: posx, y: posy, u: texu, v: texv }); if (didBboxChange) wi.SetBboxChanged() } function MeshColumns() { const wi = this.GetWorldInfo(); return wi.HasMesh() ? wi.GetSourceMesh().GetHSize() : 0 } function MeshRows() { const wi = this.GetWorldInfo(); return wi.HasMesh() ? wi.GetSourceMesh().GetVSize() : 0 } function SetElementVisible(v) { const wi = this.GetWorldInfo(); if (v === 2) v = !wi.IsVisible(); else v = v !== 0; if (wi.IsVisible() === v) return; wi.SetVisible(v) } function SetElementCSSStyle(prop, val) { this.SetElementCSSStyle(prop, val) } function SetElementAttribute(attribName, value) { this.SetElementAttribute(attribName, "" + value) } function RemoveElementAttribute(attribName) { this.RemoveElementAttribute(attribName) } function SetElementFocus() { this.FocusElement() } function SetElementBlur() { this.BlurElement() } function IsElementFocused() { return this.IsElementFocused() } function SetElementEnabled(e) { this._SetEnabled(e !== 0) } function IsElementEnabled() { return this._IsEnabled() } function CompareInstanceVar(iv, cmp, val) { return C3.compare(this.GetInstance().GetInstanceVariableValue(iv), cmp, val) } function IsBoolInstanceVarSet(iv) { return !!this.GetInstance().GetInstanceVariableValue(iv) } function PickInstVarHiLow(which, iv) { const sol = this.GetCurrentSol(); const instances = sol.GetInstances(); if (!instances.length) return false; let inst = instances[0]; let pickme = inst; let val = inst.GetInstanceVariableValue(iv); for (let i = 1, len = instances.length; i < len; ++i) { inst = instances[i]; const v = inst.GetInstanceVariableValue(iv); if (which === 0 && v < val || which === 1 && v > val) { val = v; pickme = inst } } sol.PickOne(pickme); return true } function PickByUID(uid) { if (this._runtime.GetCurrentCondition().IsInverted()) return PickByUID_Inverted(this, uid); else return PickByUID_Normal(this, uid) } function PickByUID_Normal(objectClass, uid) { const inst = objectClass.GetRuntime().GetInstanceByUID(uid); if (!inst) return false; const sol = objectClass.GetCurrentSol(); if (!sol.IsSelectAll() && !sol._GetOwnInstances().includes(inst)) return false; if (objectClass.IsFamily()) { if (inst.GetObjectClass().BelongsToFamily(objectClass)) { sol.PickOne(inst); objectClass.ApplySolToContainer(); return true } } else if (inst.GetObjectClass() === objectClass) { sol.PickOne(inst); objectClass.ApplySolToContainer(); return true } return false } function PickByUID_Inverted(objectClass, uid) { const sol = objectClass.GetCurrentSol(); if (sol.IsSelectAll()) { sol._SetSelectAll(false); sol.ClearArrays(); const instances = objectClass.GetInstances(); for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; if (inst.GetUID() === uid) sol._PushElseInstance(inst); else sol._PushInstance(inst) } objectClass.ApplySolToContainer(); return !!sol._GetOwnInstances().length } else { const instances = sol._GetOwnInstances(); let j = 0; for (let i = 0, len = instances.length; i < len; ++i) { const inst = instances[i]; instances[j] = inst; if (inst.GetUID() === uid) sol._PushElseInstance(inst); else ++j } C3.truncateArray(instances, j); objectClass.ApplySolToContainer(); return !!instances.length } } function Destroy() { this._runtime.DestroyInstance(this._inst) } function OnCreated() { return true } function OnDestroyed() { return true } function SetInstanceVar(iv, value) { this.GetInstance().SetInstanceVariableValue(iv, value) } function AddInstanceVar(iv, value) { const instance = this.GetInstance(); const lastValue = instance.GetInstanceVariableValue(iv); if (typeof lastValue === "number" && typeof value !== "number") value = parseFloat(value); else if (typeof lastValue === "string" && typeof value !== "string") value = value.toString(); instance.SetInstanceVariableValue(iv, lastValue + value) } function SubInstanceVar(iv, value) { const instance = this.GetInstance(); const lastValue = instance.GetInstanceVariableValue(iv); if (typeof lastValue !== "number") return; if (typeof value !== "number") value = parseFloat(value); instance.SetInstanceVariableValue(iv, lastValue - value) } function SetBoolInstanceVar(iv, value) { this.GetInstance().SetInstanceVariableValue(iv, value ? 1 : 0) } function ToggleBoolInstanceVar(iv) { const instance = this.GetInstance(); instance.SetInstanceVariableValue(iv, instance.GetInstanceVariableValue(iv) === 0 ? 1 : 0) } function LoadFromJsonString(str) { let o; try { o = JSON.parse(str) } catch (err) { console.error("Failed to load from JSON string: ", err); return } this.GetInstance().LoadFromJson(o, "state") } function AsJSON() { return JSON.stringify(this.GetInstance().SaveToJson("state")) } function ObjectTypeName() { return this.GetInstance().GetObjectClass().GetName() } function Count() { const expObjectClass = this._runtime.GetCurrentEventStackFrame().GetExpressionObjectClass(); let count = expObjectClass.GetInstanceCount(); const instancesPendingCreate = this._runtime._GetInstancesPendingCreate(); for (const inst of instancesPendingCreate) if (expObjectClass.IsFamily()) { if (inst.GetObjectClass().BelongsToFamily(expObjectClass)) ++count } else if (inst.GetObjectClass() === expObjectClass) ++count; return count } function PickedCount() { return this._runtime.GetCurrentEventStackFrame().GetExpressionObjectClass().GetCurrentSol().GetInstances().length } function GetIID() { return this._inst.GetIID() } function GetUID() { return this._inst.GetUID() } C3.AddCommonACEs = function AddCommonACEs(pluginData, pluginCtor) { const isSingleGlobal = pluginData[1]; const hasPositionACEs = pluginData[3]; const hasSizeACEs = pluginData[4]; const hasAngleACEs = pluginData[5]; const hasAppearanceACEs = pluginData[6]; const hasZOrderACEs = pluginData[7]; const hasEffectsACEs = pluginData[8]; const hasElementACEs = pluginData[10]; const hasElementFocusACEs = pluginData[11]; const hasElementEnabledACEs = pluginData[12]; const hasSceneGraphACEs = pluginData[13]; const hasMeshACEs = pluginData[14]; const Cnds = pluginCtor.Cnds; const Acts = pluginCtor.Acts; const Exps = pluginCtor.Exps; if (hasPositionACEs) { Cnds.CompareX = CompareX; Cnds.CompareY = CompareY; Cnds.IsOnScreen = IsOnScreen; Cnds.IsOutsideLayout = IsOutsideLayout; Cnds.PickDistance = PickDistance; Acts.SetX = SetX; Acts.SetY = SetY; Acts.SetPos = SetPos; Acts.SetPosToObject = SetPosToObject; Acts.MoveForward = MoveForward; Acts.MoveAtAngle = MoveAtAngle; Exps.X = GetX; Exps.Y = GetY; Exps.dt = GetDt } if (hasSizeACEs) { Cnds.CompareWidth = CompareWidth; Cnds.CompareHeight = CompareHeight; Acts.SetWidth = SetWidth; Acts.SetHeight = SetHeight; Acts.SetSize = SetSize; Exps.Width = GetWidth; Exps.Height = GetHeight; Exps.BBoxLeft = GetBboxLeft; Exps.BBoxTop = GetBboxTop; Exps.BBoxRight = GetBboxRight; Exps.BBoxBottom = GetBboxBottom } if (hasAngleACEs) { Cnds.AngleWithin = IsAngleWithin; Cnds.IsClockwiseFrom = IsAngleClockwiseFrom; Cnds.IsBetweenAngles = IsBetweenAngles; Acts.SetAngle = SetAngle; Acts.RotateClockwise = RotateClockwise; Acts.RotateCounterclockwise = RotateCounterclockwise; Acts.RotateTowardAngle = RotateTowardAngle; Acts.RotateTowardPosition = RotateTowardPosition; Acts.SetTowardPosition = SetTowardPosition; Exps.Angle = GetAngle } if (hasAppearanceACEs) { Cnds.IsVisible = IsVisible; Cnds.CompareOpacity = CompareOpacity; Acts.SetVisible = SetVisible; Acts.SetOpacity = SetOpacity; Acts.SetDefaultColor = SetDefaultColor; Exps.Opacity = GetOpacity; Exps.ColorValue = GetColor } if (hasZOrderACEs) { Cnds.IsOnLayer = IsOnLayer; Cnds.PickTopBottom = PickTopBottom; Cnds.CompareZElevation = CompareZElevation; Acts.MoveToTop = MoveToTop; Acts.MoveToBottom = MoveToBottom; Acts.MoveToLayer = MoveToLayer; Acts.ZMoveToObject = ZMoveToObject; Acts.SetZElevation = SetZElevation; Exps.LayerNumber = LayerNumber; Exps.LayerName = LayerName; Exps.ZIndex = ZIndex; Exps.ZElevation = ZElevation; Exps.TotalZElevation = TotalZElevation } if (hasEffectsACEs) { Acts.SetEffectEnabled = SetEffectEnabled; Acts.SetEffectParam = SetEffectParam } if (hasSceneGraphACEs) { Cnds.HasParent = HasParent; Cnds.HasChildren = HasChildren; Cnds.PickParent = PickParent; Cnds.PickChildren = PickChildren; Cnds.PickNthChild = PickNthChild; Cnds.CompareChildCount = CompareChildCount; Acts.AddChild = AddChild; Acts.RemoveChild = RemoveChild; Acts.RemoveFromParent = RemoveFromParent; Exps.ChildCount = ChildCount } if (hasMeshACEs) { Acts.SetMeshSize = SetMeshSize; Acts.SetMeshPoint = SetMeshPoint; Exps.MeshColumns = MeshColumns; Exps.MeshRows = MeshRows } if (hasElementACEs) { Cnds.IsVisible = IsVisible; Acts.SetVisible = SetElementVisible; Acts.SetCSSStyle = SetElementCSSStyle; Acts.SetElemAttribute = SetElementAttribute; Acts.RemoveElemAttribute = RemoveElementAttribute } if (hasElementFocusACEs) { Cnds.IsFocused = IsElementFocused; Acts.SetFocus = SetElementFocus; Acts.SetBlur = SetElementBlur } if (hasElementEnabledACEs) { Cnds.IsEnabled = IsElementEnabled; Acts.SetEnabled = SetElementEnabled } if (!isSingleGlobal) { Cnds.CompareInstanceVar = CompareInstanceVar; Cnds.IsBoolInstanceVarSet = IsBoolInstanceVarSet; Cnds.PickInstVarHiLow = PickInstVarHiLow; Cnds.PickByUID = PickByUID; Acts.SetInstanceVar = SetInstanceVar; Acts.AddInstanceVar = AddInstanceVar; Acts.SubInstanceVar = SubInstanceVar; Acts.SetBoolInstanceVar = SetBoolInstanceVar; Acts.ToggleBoolInstanceVar = ToggleBoolInstanceVar; Cnds.OnCreated = OnCreated; Cnds.OnDestroyed = OnDestroyed; Acts.Destroy = Destroy; if (!Acts.LoadFromJsonString) Acts.LoadFromJsonString = LoadFromJsonString; if (!Exps.AsJSON) Exps.AsJSON = AsJSON; Exps.Count = Count; Exps.PickedCount = PickedCount; Exps.IID = GetIID; Exps.UID = GetUID; Exps.ObjectTypeName = ObjectTypeName } } } ;'use strict'; { const C3 = self.C3; C3.ScheduledWait = class ScheduledWait extends C3.DefendedBase { constructor(eventSheetManager) { super(); this._eventSheetManager = eventSheetManager; this._type = ""; this._time = -1; this._signalTag = ""; this._isSignalled = false; this._event = null; this._actIndex = 0; this._solModifiers = []; this._sols = new Map; this._callingFunctionBlock = null; this._asyncId = -1; this._functionParameters = null; this._shouldRelease = false } Release() { this._type = ""; this._time = -1; this._signalTag = ""; this._event = null; this._callingFunctionBlock = null; this._functionParameters = null; this._asyncId = -1; C3.clearArray(this._solModifiers); for (const s of this._sols.values()) s.Release(); this._sols.clear() } _Init() { const eventSheetManager = this._eventSheetManager; const allObjectClasses = eventSheetManager.GetRuntime().GetAllObjectClasses(); const frame = eventSheetManager.GetCurrentEventStackFrame(); this._event = frame.GetCurrentEvent(); this._actIndex = frame.GetActionIndex() + 1; const functionBlock = eventSheetManager.FindFirstFunctionBlockParent(this._event); if (functionBlock) { this._callingFunctionBlock = functionBlock; this._functionParameters = functionBlock.CaptureFunctionParameters(); if (functionBlock.IsAsync()) this._asyncId = functionBlock.PauseCurrentAsyncFunction() } for (const objectClass of allObjectClasses) { const sol = objectClass.GetCurrentSol(); if (sol.IsSelectAll() && !this._event.HasSolModifier(objectClass)) continue; this._solModifiers.push(objectClass); this._sols.set(objectClass, C3.New(C3.SolState, sol)) } } InitTimer(seconds) { this._type = "timer"; this._Init(); this._time = this._eventSheetManager.GetRuntime().GetGameTime() + seconds } InitSignal(tag) { this._type = "signal"; this._Init(); this._signalTag = tag.toLowerCase() } InitPromise(p) { this._type = "promise"; this._Init(); p.then(()=>this.SetSignalled()).catch(err=>{ console.warn("[C3 runtime] Promise rejected in 'Wait for previous actions to complete': ", err); this.SetSignalled() } ) } IsTimer() { return this._type === "timer" } IsSignal() { return this._type === "signal" } IsPromise() { return this._type === "promise" } GetSignalTag() { return this._signalTag } IsSignalled() { return this._isSignalled } SetSignalled() { this._isSignalled = true } _ShouldRun() { if (this.IsTimer()) return this._time <= this._eventSheetManager.GetRuntime().GetGameTime(); else return this.IsSignalled() } _RestoreState(frame) { frame._Restore(this._event, this._actIndex); for (const [objectClass,solState] of this._sols.entries()) { const sol = objectClass.GetCurrentSol(); solState._Restore(sol) } const callingFunctionBlock = this._callingFunctionBlock; if (callingFunctionBlock) { callingFunctionBlock.SetFunctionParameters(this._functionParameters); if (callingFunctionBlock.IsAsync()) callingFunctionBlock.ResumeAsyncFunction(this._asyncId) } } _Run(frame) { this._RestoreState(frame); this._event._ResumeActionsAndSubEvents(frame); if (this._callingFunctionBlock && this._callingFunctionBlock.IsAsync()) this._callingFunctionBlock.MaybeFinishAsyncFunctionCall(this._asyncId); this._eventSheetManager.ClearSol(this._solModifiers); this._shouldRelease = true } async _DebugRun(frame) { this._RestoreState(frame); for (const breakEventObject of this._event._DebugResumeActionsAndSubEvents(frame)) await this._eventSheetManager.GetRuntime().DebugBreak(breakEventObject); if (this._callingFunctionBlock && this._callingFunctionBlock.IsAsync()) this._callingFunctionBlock.MaybeFinishAsyncFunctionCall(this._asyncId); this._eventSheetManager.ClearSol(this._solModifiers); this._shouldRelease = true } ShouldRelease() { return this._shouldRelease } RemoveInstances(s) { for (const solState of this._sols.values()) solState.RemoveInstances(s) } _SaveToJson() { const sols = {}; const o = { "t": this._time, "st": this._signalTag, "s": this._isSignalled, "ev": this._event.GetSID(), "sm": this._solModifiers.map(oc=>oc.GetSID()), "sols": sols }; if (this._event._HasActionIndex(this._actIndex)) o["act"] = this._event.GetActionAt(this._actIndex).GetSID(); for (const [objectClass,solState] of this._sols) sols[objectClass.GetSID().toString()] = solState._SaveToJson(); return o } static _CreateFromJson(eventSheetManager, o) { const runtime = eventSheetManager.GetRuntime(); const event = eventSheetManager.GetEventBlockBySID(o["ev"]); if (!event) return null; let actIndex = 0; if (o.hasOwnProperty("act")) { const act = eventSheetManager.GetActionBySID(o["act"]); if (!act) return null; actIndex = act.GetIndex() } const sw = C3.New(C3.ScheduledWait, eventSheetManager); sw._time = o["t"]; sw._type = sw._time === -1 ? "signal" : "timer"; sw._signalTag = o["st"]; sw._isSignalled = o["s"]; sw._event = event; sw._actIndex = actIndex; for (const sid of o["sm"]) { const objectClass = runtime.GetObjectClassBySID(sid); if (objectClass) sw._solModifiers.push(objectClass) } for (const [sidStr,solData] of Object.entries(o["sols"])) { const sid = parseInt(sidStr, 10); const objectClass = runtime.GetObjectClassBySID(sid); if (!objectClass) continue; const solState = C3.New(C3.SolState, null); solState._LoadFromJson(eventSheetManager, solData); sw._sols.set(objectClass, solState) } return sw } } } ;'use strict'; { const C3 = self.C3; C3.SolState = class SolState extends C3.DefendedBase { constructor(sol) { super(); this._objectClass = null; this._isSelectAll = true; this._instances = []; if (sol) { this._objectClass = sol.GetObjectClass(); this._isSelectAll = sol.IsSelectAll(); C3.shallowAssignArray(this._instances, sol._GetOwnInstances()) } } Release() { this._objectClass = null; C3.clearArray(this._instances) } _Restore(sol) { sol._SetSelectAll(this._isSelectAll); C3.shallowAssignArray(sol._GetOwnInstances(), this._instances) } RemoveInstances(s) { C3.arrayRemoveAllInSet(this._instances, s) } _SaveToJson() { return { "sa": this._isSelectAll, "insts": this._instances.map(inst=>inst.GetUID()) } } _LoadFromJson(eventSheetManager, o) { const runtime = eventSheetManager.GetRuntime(); this._isSelectAll = !!o["sa"]; C3.clearArray(this._instances); for (const uid of o["insts"]) { const inst = runtime.GetInstanceByUID(uid); if (inst) this._instances.push(inst) } } } } ;'use strict'; { const C3 = self.C3; function GetNextParamMap(paramMap, param) { let nextParamMap = paramMap.get(param); if (!nextParamMap) { nextParamMap = new Map; paramMap.set(param, nextParamMap) } return nextParamMap } C3.SDKPluginBase = class SDKPluginBase extends C3.DefendedBase { constructor(opts) { super(); this._runtime = opts.runtime; this._isSingleGlobal = !!opts.isSingleGlobal; this._isWorldType = !!opts.isWorld; this._isRotatable = !!opts.isRotatable; this._mustPredraw = !!opts.mustPredraw; this._hasEffects = !!opts.hasEffects; this._supportsSceneGraph = !!opts.supportsSceneGraph; this._supportsMesh = !!opts.supportsMesh; this._singleGlobalObjectClass = null; this._boundACEMethodCache = new Map; this._boundACEMethodCache_1param = new Map; this._boundACEMethodCache_2params = new Map; this._boundACEMethodCache_3params = new Map } Release() { this._runtime = null } GetRuntime() { return this._runtime } OnCreate() {} IsSingleGlobal() { return this._isSingleGlobal } IsWorldType() { return this._isWorldType } IsRotatable() { return this._isRotatable } MustPreDraw() { return this._mustPredraw } HasEffects() { return this._hasEffects } SupportsSceneGraph() { return this._supportsSceneGraph } SupportsMesh() { return this._supportsMesh } _GetBoundACEMethod(func, bindThis) { if (!bindThis) throw new Error("missing 'this' binding"); let ret = this._boundACEMethodCache.get(func); if (ret) return ret; ret = func.bind(bindThis); this._boundACEMethodCache.set(func, ret); return ret } _GetBoundACEMethod_1param(func, bindThis, param0) { if (!bindThis) throw new Error("missing 'this' binding"); const param0map = GetNextParamMap(this._boundACEMethodCache_1param, func); let ret = param0map.get(param0); if (ret) return ret; ret = func.bind(bindThis, param0); param0map.set(param0, ret); return ret } _GetBoundACEMethod_2params(func, bindThis, param0, param1) { if (!bindThis) throw new Error("missing 'this' binding"); const param0map = GetNextParamMap(this._boundACEMethodCache_2params, func); const param1map = GetNextParamMap(param0map, param0); let ret = param1map.get(param1); if (ret) return ret; ret = func.bind(bindThis, param0, param1); param1map.set(param1, ret); return ret } _GetBoundACEMethod_3params(func, bindThis, param0, param1, param2) { if (!bindThis) throw new Error("missing 'this' binding"); const param0map = GetNextParamMap(this._boundACEMethodCache_3params, func); const param1map = GetNextParamMap(param0map, param0); const param2map = GetNextParamMap(param1map, param1); let ret = param2map.get(param2); if (ret) return ret; ret = func.bind(bindThis, param0, param1, param2); param2map.set(param2, ret); return ret } _SetSingleGlobalObjectClass(objectClass) { if (!this.IsSingleGlobal()) throw new Error("must be single-global plugin"); this._singleGlobalObjectClass = objectClass } GetSingleGlobalObjectClass() { if (!this.IsSingleGlobal()) throw new Error("must be single-global plugin"); return this._singleGlobalObjectClass } GetSingleGlobalInstance() { if (!this.IsSingleGlobal()) throw new Error("must be single-global plugin"); return this._singleGlobalObjectClass.GetSingleGlobalInstance() } } } ;'use strict'; { const C3 = self.C3; C3.SDKDOMPluginBase = class SDKDOMPluginBase extends C3.SDKPluginBase { constructor(opts, DOM_COMPONENT_ID) { super(opts); this._domComponentId = DOM_COMPONENT_ID; this._nextElementId = 0; this._instMap = new Map; this.AddElementMessageHandler("elem-focused", sdkInst=>sdkInst._OnElemFocused()); this.AddElementMessageHandler("elem-blurred", sdkInst=>{ if (sdkInst) sdkInst._OnElemBlurred() } ) } Release() { super.Release() } _AddElement(sdkInst) { const elementId = this._nextElementId++; this._instMap.set(elementId, sdkInst); return elementId } _RemoveElement(elementId) { this._instMap.delete(elementId) } AddElementMessageHandler(handler, func) { this._runtime.AddDOMComponentMessageHandler(this._domComponentId, handler, e=>{ const sdkInst = this._instMap.get(e["elementId"]); func(sdkInst, e) } ) } } } ;'use strict'; { const C3 = self.C3; C3.SDKTypeBase = class SDKTypeBase extends C3.DefendedBase { constructor(objectClass) { super(); this._objectClass = objectClass; this._runtime = objectClass.GetRuntime(); this._plugin = objectClass.GetPlugin() } Release() { this._objectClass = null; this._runtime = null; this._plugin = null } GetObjectClass() { return this._objectClass } GetRuntime() { return this._runtime } GetPlugin() { return this._plugin } GetImageInfo() { return this._objectClass.GetImageInfo() } FinishCondition(f) {} LoadTextures(renderer) {} ReleaseTextures() {} OnDynamicTextureLoadComplete() {} PreloadTexturesWithInstances(renderer) {} LoadTilemapData() {} GetScriptInterfaceClass() { return null } } } ;'use strict'; { const C3 = self.C3; C3.SDKInstanceBase = class SDKInstanceBase extends C3.DefendedBase { constructor(inst, domComponentId) { super(); this._inst = inst; this._domComponentId = domComponentId; this._runtime = inst.GetRuntime(); this._objectClass = this._inst.GetObjectClass(); this._sdkType = this._objectClass.GetSdkType(); this._tickFunc = null; this._tick2Func = null; this._isTicking = false; this._isTicking2 = false; this._disposables = null; this._wasReleased = false } Release() { this._wasReleased = true; this._StopTicking(); this._StopTicking2(); this._tickFunc = null; this._tick2Func = null; if (this._disposables) { this._disposables.Release(); this._disposables = null } this._inst = null; this._runtime = null; this._objectClass = null; this._sdkType = null } WasReleased() { return this._wasReleased } GetInstance() { return this._inst } GetRuntime() { return this._runtime } GetObjectClass() { return this._objectClass } GetPlugin() { return this._sdkType.GetPlugin() } GetSdkType() { return this._sdkType } GetScriptInterface() { return this._inst.GetInterfaceClass() } Trigger(method) { return this._runtime.Trigger(method, this._inst, null) } DebugTrigger(method) { return this._runtime.DebugTrigger(method, this._inst, null) } TriggerAsync(method) { return this._runtime.TriggerAsync(method, this._inst, null) } FastTrigger(method, value) { return this._runtime.FastTrigger(method, this._inst, value) } DebugFastTrigger(method, value) { return this._runtime.DebugFastTrigger(method, this._inst, value) } ScheduleTriggers(f) { return this._runtime.ScheduleTriggers(f) } AddDOMMessageHandler(handler, func) { this._runtime.AddDOMComponentMessageHandler(this._domComponentId, handler, func) } AddDOMMessageHandlers(list) { for (const [handler,func] of list) this.AddDOMMessageHandler(handler, func) } PostToDOM(handler, data) { this._runtime.PostComponentMessageToDOM(this._domComponentId, handler, data) } PostToDOMAsync(handler, data) { return this._runtime.PostComponentMessageToDOMAsync(this._domComponentId, handler, data) } _PostToDOMMaybeSync(handler, data) { if (this._runtime.IsInWorker()) this.PostToDOM(handler, data); else return window["c3_runtimeInterface"]["_OnMessageFromRuntime"]({ "type": "event", "component": this._domComponentId, "handler": handler, "data": data, "responseId": null }) } GetCurrentImageInfo() { return null } GetCurrentSurfaceSize() { const imageInfo = this.GetCurrentImageInfo(); if (imageInfo) { const texture = imageInfo.GetTexture(); if (texture) return [texture.GetWidth(), texture.GetHeight()] } return [100, 100] } GetCurrentTexRect() { const imageInfo = this.GetCurrentImageInfo(); return imageInfo ? imageInfo.GetTexRect() : null } GetImagePoint(nameOrIndex) { const wi = this._inst.GetWorldInfo(); return [wi.GetX(), wi.GetY()] } Tick() {} Tick2() {} _StartTicking() { if (this._isTicking) return; if (!this._tickFunc) this._tickFunc = ()=>this.Tick(); this._runtime.Dispatcher().addEventListener("tick", this._tickFunc); this._isTicking = true } _StopTicking() { if (!this._isTicking) return; this._runtime.Dispatcher().removeEventListener("tick", this._tickFunc); this._isTicking = false } IsTicking() { return this._isTicking } _StartTicking2() { if (this._isTicking2) return; if (!this._tick2Func) this._tick2Func = ()=>this.Tick2(); this._runtime.Dispatcher().addEventListener("tick2", this._tick2Func); this._isTicking2 = true } _StopTicking2() { if (!this._isTicking2) return; this._runtime.Dispatcher().removeEventListener("tick2", this._tick2Func); this._isTicking2 = false } IsTicking2() { return this._isTicking2 } GetDebuggerProperties() { return [] } SaveToJson() { return null } LoadFromJson(o) {} LoadTilemapData(data, mapWidth, mapHeight) {} TestPointOverlapTile(x, y) {} GetPropertyValueByIndex(index) {} SetPropertyValueByIndex(index, value) {} OffsetPropertyValueByIndex(index, offset) { if (offset === 0) return; const value = this.GetPropertyValueByIndex(index); if (typeof value !== "number") throw new Error("expected number"); this.SetPropertyValueByIndex(index, value + offset) } SetPropertyColorOffsetValueByIndex(offset, r, g, b) {} CallAction(actMethod, ...args) { actMethod.call(this, ...args) } CallExpression(expMethod, ...args) { return expMethod.call(this, ...args) } GetScriptInterfaceClass() { return null } } } ;'use strict'; { const C3 = self.C3; C3.SDKWorldInstanceBase = class SDKWorldInstanceBase extends C3.SDKInstanceBase { constructor(inst, domComponentId) { super(inst, domComponentId); this._worldInfo = inst.GetWorldInfo(); this._webglcontextlost_handler = null; this._webglcontextrestored_handler = null } Release() { if (this._webglcontextlost_handler) { const dispatcher = this._runtime.Dispatcher(); dispatcher.removeEventListener("webglcontextlost", this._webglcontextlost_handler); dispatcher.removeEventListener("webglcontextrestored", this._webglcontextrestored_handler); this._webglcontextlost_handler = null; this._webglcontextrestored_handler = null } this._worldInfo = null; super.Release() } HandleWebGLContextLoss() { if (this._webglcontextlost_handler) return; this._webglcontextlost_handler = ()=>this.OnWebGLContextLost(); this._webglcontextrestored_handler = ()=>this.OnWebGLContextRestored(); const dispatcher = this._runtime.Dispatcher(); dispatcher.addEventListener("webglcontextlost", this._webglcontextlost_handler); dispatcher.addEventListener("webglcontextrestored", this._webglcontextrestored_handler) } OnWebGLContextLost() {} OnWebGLContextRestored() {} GetWorldInfo() { return this._worldInfo } } } ;'use strict'; { const C3 = self.C3; const tempRect = C3.New(C3.Rect); C3.SDKDOMInstanceBase = class SDKDOMInstanceBase extends C3.SDKWorldInstanceBase { constructor(inst, domComponentId) { super(inst, domComponentId); this._elementId = this.GetPlugin()._AddElement(this); this._isElementShowing = true; this._elemHasFocus = false; this._autoFontSize = false; this._lastRect = C3.New(C3.Rect, 0, 0, -1, -1); const canvasManager = this._runtime.GetCanvasManager(); this._lastWindowWidth = canvasManager.GetLastWidth(); this._lastWindowHeight = canvasManager.GetLastHeight(); this._isPendingUpdateState = false; this._StartTicking() } Release() { this.GetPlugin()._RemoveElement(this._elementId); this.PostToDOMElement("destroy"); this._elementId = -1; super.Release() } _GetElementInDOMMode() { if (this._runtime.IsInWorker()) throw new Error("not valid in worker mode"); return this._PostToDOMElementMaybeSync("get-element") } PostToDOMElement(handler, data) { if (!data) data = {}; data["elementId"] = this._elementId; this.PostToDOM(handler, data) } _PostToDOMElementMaybeSync(handler, data) { if (!data) data = {}; data["elementId"] = this._elementId; return this._PostToDOMMaybeSync(handler, data) } PostToDOMElementAsync(handler, data) { if (!data) data = {}; data["elementId"] = this._elementId; return this.PostToDOMAsync(handler, data) } CreateElement(data) { if (!data) data = {}; const isVisible = this.GetWorldInfo().IsVisible(); data["elementId"] = this._elementId; data["isVisible"] = isVisible; Object.assign(data, this.GetElementState()); this._isElementShowing = !!data["isVisible"]; this._PostToDOMMaybeSync("create", data); this._UpdatePosition(true) } SetElementVisible(v) { v = !!v; if (this._isElementShowing === v) return; this._isElementShowing = v; this.PostToDOMElement("set-visible", { "isVisible": v }) } Tick() { this._UpdatePosition(false) } _ShouldPreserveElement() { const fullscreenMode = this._runtime.GetCanvasManager().GetFullscreenMode(); return C3.Platform.OS === "Android" && (fullscreenMode === "scale-inner" || fullscreenMode === "scale-outer" || fullscreenMode === "crop") } _UpdatePosition(first) { const wi = this.GetWorldInfo(); const layer = wi.GetLayer(); const x = wi.GetX(); const y = wi.GetY(); let[cleft,ctop] = layer.LayerToCanvasCss(x, y); let[cright,cbottom] = layer.LayerToCanvasCss(x + wi.GetWidth(), y + wi.GetHeight()); const canvasManager = this._runtime.GetCanvasManager(); const rightEdge = canvasManager.GetCssWidth(); const bottomEdge = canvasManager.GetCssHeight(); if (!wi.IsVisible() || !layer.IsVisible()) { this.SetElementVisible(false); return } if (!this._ShouldPreserveElement()) { if (cright <= 0 || cbottom <= 0 || cleft >= rightEdge || ctop >= bottomEdge) { this.SetElementVisible(false); return } if (cleft < 1) cleft = 1; if (ctop < 1) ctop = 1; if (cright >= rightEdge) cright = rightEdge - 1; if (cbottom >= bottomEdge) cbottom = bottomEdge - 1 } tempRect.set(cleft, ctop, cright, cbottom); const curWinWidth = canvasManager.GetLastWidth(); const curWinHeight = canvasManager.GetLastHeight(); if (!first && tempRect.equals(this._lastRect) && this._lastWindowWidth === curWinWidth && this._lastWindowHeight === curWinHeight) { this.SetElementVisible(true); return } this._lastRect.copy(tempRect); this._lastWindowWidth = curWinWidth; this._lastWindowHeight = curWinHeight; this.SetElementVisible(true); let fontSize = null; if (this._autoFontSize) fontSize = layer.GetDisplayScale() - .2; this.PostToDOMElement("update-position", { "left": Math.round(this._lastRect.getLeft()) + canvasManager.GetCanvasClientX(), "top": Math.round(this._lastRect.getTop()) + canvasManager.GetCanvasClientY(), "width": Math.round(this._lastRect.width()), "height": Math.round(this._lastRect.height()), "fontSize": fontSize }) } FocusElement() { this._PostToDOMElementMaybeSync("focus", { "focus": true }) } BlurElement() { this._PostToDOMElementMaybeSync("focus", { "focus": false }) } _OnElemFocused() { this._elemHasFocus = true } _OnElemBlurred() { this._elemHasFocus = false } IsElementFocused() { return this._elemHasFocus } SetElementCSSStyle(prop, val) { this.PostToDOMElement("set-css-style", { "prop": C3.CSSToCamelCase(prop), "val": val }) } SetElementAttribute(attribName, value) { this.PostToDOMElement("set-attribute", { "name": attribName, "val": value }) } RemoveElementAttribute(attribName) { this.PostToDOMElement("remove-attribute", { "name": attribName }) } UpdateElementState() { if (this._isPendingUpdateState) return; this._isPendingUpdateState = true; Promise.resolve().then(()=>{ this._isPendingUpdateState = false; this.PostToDOMElement("update-state", this.GetElementState()) } ) } GetElementState() {} GetElementId() { return this._elementId } } } ;'use strict'; { const C3 = self.C3; const IBehavior = self.IBehavior; C3.SDKBehaviorBase = class SDKBehaviorBase extends C3.DefendedBase { constructor(opts) { super(); this._runtime = opts.runtime; this._myObjectClasses = C3.New(C3.ArraySet); this._myInstances = C3.New(C3.ArraySet); this._iBehavior = null; const CustomScriptClass = opts.scriptInterfaceClass; if (CustomScriptClass) { this._iBehavior = new CustomScriptClass(this); if (!(this._iBehavior instanceof IBehavior)) throw new TypeError("script interface class must derive from IBehavior"); } else this._iBehavior = new IBehavior(this) } Release() { this._myInstances.Release(); this._myObjectClasses.Release(); this._runtime = null } GetRuntime() { return this._runtime } OnCreate() {} _AddObjectClass(objectClass) { this._myObjectClasses.Add(objectClass) } GetObjectClasses() { return this._myObjectClasses.GetArray() } _AddInstance(inst) { this._myInstances.Add(inst) } _RemoveInstance(inst) { this._myInstances.Delete(inst) } GetInstances() { return this._myInstances.GetArray() } GetIBehavior() { return this._iBehavior } } } ;'use strict'; { const C3 = self.C3; C3.SDKBehaviorTypeBase = class SDKBehaviorTypeBase extends C3.DefendedBase { constructor(behaviorType) { super(); this._runtime = behaviorType.GetRuntime(); this._behaviorType = behaviorType; this._objectClass = behaviorType.GetObjectClass(); this._behavior = behaviorType.GetBehavior(); this._behavior._AddObjectClass(this._objectClass) } Release() { this._runtime = null; this._behaviorType = null; this._objectClass = null; this._behavior = null } GetBehaviorType() { return this._behaviorType } GetObjectClass() { return this._objectClass } GetRuntime() { return this._runtime } GetBehavior() { return this._behavior } } } ;'use strict'; { const C3 = self.C3; C3.SDKBehaviorInstanceBase = class SDKBehaviorInstanceBase extends C3.DefendedBase { constructor(behInst, domComponentId) { super(); this._behInst = behInst; this._domComponentId = domComponentId; this._inst = behInst.GetObjectInstance(); this._runtime = behInst.GetRuntime(); this._behaviorType = behInst.GetBehaviorType(); this._sdkType = this._behaviorType.GetSdkType(); this._isTicking = false; this._isTicking2 = false; this._isPostTicking = false; this._disposables = null } Release() { this._StopTicking(); this._StopTicking2(); this._StopPostTicking(); if (this._disposables) { this._disposables.Release(); this._disposables = null } this._behInst = null; this._inst = null; this._runtime = null; this._behaviorType = null; this._sdkType = null } GetBehavior() { return this._behaviorType.GetBehavior() } GetBehaviorInstance() { return this._behInst } GetObjectInstance() { return this._inst } GetObjectClass() { return this._inst.GetObjectClass() } GetWorldInfo() { return this._inst.GetWorldInfo() } GetRuntime() { return this._runtime } GetBehaviorType() { return this._behaviorType } GetSdkType() { return this._sdkType } GetScriptInterface() { return this._behInst.GetScriptInterface() } Trigger(method) { return this._runtime.Trigger(method, this._inst, this._behaviorType) } DebugTrigger(method) { return this._runtime.DebugTrigger(method, this._inst, this._behaviorType) } TriggerAsync(method) { return this._runtime.TriggerAsync(method, this._inst, this._behaviorType) } PostCreate() {} Tick() {} Tick2() {} PostTick() {} _StartTicking() { if (this._isTicking) return; this._runtime._AddBehInstToTick(this); this._isTicking = true } _StopTicking() { if (!this._isTicking) return; this._runtime._RemoveBehInstToTick(this); this._isTicking = false } IsTicking() { return this._isTicking } _StartTicking2() { if (this._isTicking2) return; this._runtime._AddBehInstToTick2(this); this._isTicking2 = true } _StopTicking2() { if (!this._isTicking2) return; this._runtime._RemoveBehInstToTick2(this); this._isTicking2 = false } IsTicking2() { return this._isTicking2 } _StartPostTicking() { if (this._isPostTicking) return; this._runtime._AddBehInstToPostTick(this); this._isPostTicking = true } _StopPostTicking() { if (!this._isPostTicking) return; this._runtime._RemoveBehInstToPostTick(this); this._isPostTicking = false } IsPostTicking() { return this._isPostTicking } GetDebuggerProperties() { return [] } AddDOMMessageHandler(handler, func) { this._runtime.AddDOMComponentMessageHandler(this._domComponentId, handler, func) } OnSpriteFrameChanged(prevFrame, nextFrame) {} SaveToJson() { return null } LoadFromJson(o) {} GetPropertyValueByIndex(index) {} SetPropertyValueByIndex(index, value) {} OffsetPropertyValueByIndex(index, offset) { if (offset === 0) return; const value = this.GetPropertyValueByIndex(index); if (typeof value !== "number") throw new Error("expected number"); this.SetPropertyValueByIndex(index, value + offset) } SetPropertyColorOffsetValueByIndex(index, offsetR, offsetG, offsetB) {} CallAction(actMethod, ...args) { actMethod.call(this, ...args) } CallExpression(expMethod, ...args) { return expMethod.call(this, ...args) } GetScriptInterfaceClass() { return null } } } ;'use strict'; { const C3 = self.C3; C3.Plugins = {}; C3.Behaviors = {}; C3.PluginManager = class PluginManager extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._allPlugins = []; this._pluginsByCtor = new Map; this._systemPlugin = null; this._allBehaviors = []; this._behaviorsByCtor = new Map; this._solidBehavior = null; this._jumpthruBehavior = null } CreatePlugin(pluginData) { const Ctor = this._runtime.GetObjectReference(pluginData[0]); if (!Ctor) throw new Error("missing plugin"); C3.AddCommonACEs(pluginData, Ctor); const plugin = C3.New(Ctor, { runtime: this._runtime, isSingleGlobal: pluginData[1], isWorld: pluginData[2], isRotatable: pluginData[5], hasEffects: pluginData[8], mustPredraw: pluginData[9], supportsSceneGraph: pluginData[13], supportsMesh: pluginData[14] }); plugin.OnCreate(); this._allPlugins.push(plugin); this._pluginsByCtor.set(Ctor, plugin) } CreateSystemPlugin() { this._systemPlugin = C3.New(C3.Plugins.System, { runtime: this._runtime, isSingleGlobal: true }); this._systemPlugin.OnCreate() } CreateBehavior(behaviorData) { const Ctor = this._runtime.GetObjectReference(behaviorData[1]); if (!Ctor) throw new Error("missing behavior"); const behavior = C3.New(Ctor, { runtime: this._runtime }); behavior.OnCreate(); this._allBehaviors.push(behavior); this._behaviorsByCtor.set(Ctor, behavior); if (!this._solidBehavior && C3.Behaviors.solid && behavior instanceof C3.Behaviors.solid) this._solidBehavior = behavior; else if (!this._jumpthruBehavior && C3.Behaviors.jumpthru && behavior instanceof C3.Behaviors.jumpthru) this._jumpthruBehavior = behavior } GetPluginByConstructorFunction(ctor) { return this._pluginsByCtor.get(ctor) || null } HasBehaviorByConstructorFunction(ctor) { return this._behaviorsByCtor.has(ctor) } GetBehaviorByConstructorFunction(ctor) { return this._behaviorsByCtor.get(ctor) || null } GetSystemPlugin() { return this._systemPlugin } GetSolidBehavior() { return this._solidBehavior } GetJumpthruBehavior() { return this._jumpthruBehavior } } } ;'use strict'; { const C3 = self.C3; const allImageInfos = new Set; C3.ImageInfo = class ImageInfo extends C3.DefendedBase { constructor() { super(); this._url = ""; this._size = 0; this._pixelFormat = 0; this._offsetX = 0; this._offsetY = 0; this._width = 0; this._height = 0; this._hasMetaData = false; this._imageAsset = null; this._textureState = ""; this._rcTex = C3.New(C3.Rect); allImageInfos.add(this) } Release() { this.ReleaseTexture(); this._imageAsset = null; allImageInfos.delete(this) } static OnWebGLContextLost() { for (const imageInfo of allImageInfos) { imageInfo._textureState = ""; imageInfo._rcTex.set(0, 0, 0, 0) } } LoadData(imageData) { this._url = imageData[0]; this._size = imageData[1]; this._pixelFormat = imageData[2]; this._offsetX = imageData[3]; this._offsetY = imageData[4]; this._width = imageData[5]; this._height = imageData[6]; this._hasMetaData = true } LoadAnimationFrameData(frameData) { this._url = frameData[0]; this._size = frameData[1]; this._offsetX = frameData[2]; this._offsetY = frameData[3]; this._width = frameData[4]; this._height = frameData[5]; this._pixelFormat = frameData[11]; this._hasMetaData = true } LoadDynamicAsset(runtime, url) { if (this._imageAsset) throw new Error("already loaded asset"); this._url = url; const opts = {}; if (C3.IsAbsoluteURL(url)) opts.loadPolicy = "remote"; this.LoadAsset(runtime, opts); return this._imageAsset.Load() } ReplaceWith(otherImageInfo) { if (otherImageInfo === this) throw new Error("cannot replace with self"); this.ReleaseTexture(); this._url = otherImageInfo._url; this._size = otherImageInfo._size; this._pixelFormat = otherImageInfo._pixelFormat; this._offsetX = otherImageInfo._offsetX; this._offsetY = otherImageInfo._offsetY; this._width = otherImageInfo._width; this._height = otherImageInfo._height; this._hasMetaData = otherImageInfo._hasMetaData; this._imageAsset = otherImageInfo._imageAsset; this._textureState = otherImageInfo._textureState; this._rcTex = otherImageInfo._rcTex } GetURL() { return this._url } GetSize() { return this._size } GetPixelFormat() { return this._pixelFormat } GetOffsetX() { return this._offsetX } GetOffsetY() { return this._offsetY } GetWidth() { return this._width } GetHeight() { return this._height } GetSheetWidth() { return this._imageAsset.GetWidth() } GetSheetHeight() { return this._imageAsset.GetHeight() } LoadAsset(runtime, opts) { if (this._imageAsset) throw new Error("already got asset"); opts = Object.assign({}, opts, { url: this.GetURL(), size: this.GetSize() }); this._imageAsset = runtime.LoadImage(opts) } IsLoaded() { return this._imageAsset && this._imageAsset.IsLoaded() } async LoadStaticTexture(renderer, opts) { if (!this._imageAsset) throw new Error("no asset"); if (this._textureState) throw new Error("already loaded texture"); this._textureState = "loading"; const texture = await this._imageAsset.LoadStaticTexture(renderer, opts); if (!texture) { this._textureState = ""; return null } this._textureState = "loaded"; if (!this._hasMetaData) { this._width = texture.GetWidth(); this._height = texture.GetHeight(); this._hasMetaData = true } this._rcTex.set(this._offsetX, this._offsetY, this._offsetX + this._width, this._offsetY + this._height); this._rcTex.divide(texture.GetWidth(), texture.GetHeight()); return texture } ReleaseTexture() { if (!this._textureState) return; if (this._imageAsset) this._imageAsset.ReleaseTexture(); this._textureState = ""; this._rcTex.set(0, 0, 0, 0) } GetTexture() { return this._imageAsset ? this._imageAsset.GetTexture() : null } GetTexRect() { return this._rcTex } async ExtractImageToCanvas() { const srcDrawable = await this._imageAsset.LoadToDrawable(); const canvas = C3.CreateCanvas(this._width, this._height); const ctx = canvas.getContext("2d"); ctx.drawImage(srcDrawable, this._offsetX, this._offsetY, this._width, this._height, 0, 0, this._width, this._height); return canvas } } } ;'use strict'; { const C3 = self.C3; C3.AnimationInfo = class AnimationInfo extends C3.DefendedBase { constructor(animData) { super(); this._name = animData[0]; this._speed = animData[1]; this._isLooping = !!animData[2]; this._repeatCount = animData[3]; this._repeatTo = animData[4]; this._isPingPong = !!animData[5]; this._sid = animData[6]; this._frames = animData[7].map(frameData=>C3.New(C3.AnimationFrameInfo, frameData)) } Release() { for (const f of this._frames) f.Release(); C3.clearArray(this._frames) } LoadAllAssets(runtime) { for (const f of this._frames) f.GetImageInfo().LoadAsset(runtime) } LoadAllTextures(renderer, opts) { return Promise.all(this._frames.map(f=>f.GetImageInfo().LoadStaticTexture(renderer, opts))) } ReleaseAllTextures() { for (const f of this._frames) f.GetImageInfo().ReleaseTexture() } GetName() { return this._name } GetSID() { return this._sid } GetFrameCount() { return this._frames.length } GetFrames() { return this._frames } GetFrameAt(i) { i = Math.floor(i); if (i < 0 || i >= this._frames.length) throw new RangeError("invalid frame"); return this._frames[i] } GetSpeed() { return this._speed } IsLooping() { return this._isLooping } GetRepeatCount() { return this._repeatCount } GetRepeatTo() { return this._repeatTo } IsPingPong() { return this._isPingPong } } } ;'use strict'; { const C3 = self.C3; C3.AnimationFrameInfo = class AnimationFrameInfo extends C3.DefendedBase { constructor(frameData) { super(); this._imageInfo = C3.New(C3.ImageInfo); this._imageInfo.LoadAnimationFrameData(frameData); this._duration = frameData[6]; this._origin = C3.New(C3.Vector2, frameData[7], frameData[8]); this._imagePoints = frameData[9].map(data=>C3.New(C3.ImagePoint, this, data)); this._imagePointsByName = new Map; for (const ip of this._imagePoints) this._imagePointsByName.set(ip.GetName().toLowerCase(), ip); this._collisionPoly = null; const polyPoints = frameData[10]; if (polyPoints.length >= 6) this._collisionPoly = C3.New(C3.CollisionPoly, polyPoints) } Release() { if (this._collisionPoly) { this._collisionPoly.Release(); this._collisionPoly = null } this._imageInfo.Release(); this._imageInfo = null } GetImageInfo() { return this._imageInfo } GetDuration() { return this._duration } GetOriginX() { return this._origin.getX() } GetOriginY() { return this._origin.getY() } GetCollisionPoly() { return this._collisionPoly } GetImagePointByName(name) { return this._imagePointsByName.get(name.toLowerCase()) || null } GetImagePointByIndex(index) { index = Math.floor(index); if (index < 0 || index >= this._imagePoints.length) return null; return this._imagePoints[index] } GetImagePointCount() { return this._imagePoints.length } } } ;'use strict'; { const C3 = self.C3; C3.ImagePoint = class ImagePoint extends C3.DefendedBase { constructor(afi, data) { super(); this._afi = afi; this._name = data[0]; this._pos = C3.New(C3.Vector2, data[1], data[2]) } Release() {} GetName() { return this._name } GetX() { return this._pos.getX() } GetY() { return this._pos.getY() } GetVec2() { return this._pos } } } ;'use strict'; { const C3 = self.C3; const C3Debugger = self.C3Debugger; const IObjectClass = self.IObjectClass; const assert = self.assert; C3.ObjectClass = class ObjectClass extends C3.DefendedBase { constructor(runtime, index, data) { super(); const PluginCtor = runtime.GetObjectReference(data[1]); this._runtime = runtime; this._plugin = runtime.GetPluginManager().GetPluginByConstructorFunction(PluginCtor); this._sdkType = null; this._instSdkCtor = PluginCtor.Instance; this._index = index; this._sid = data[11]; this._name = data[0]; this._jsPropName = this._runtime.GetJsPropName(data[14]); this._isGlobal = !!data[9]; this._isFamily = !!data[2]; this._isOnLoaderLayout = !!data[10]; this._instVars = data[3].map(arr=>({ sid: arr[0], type: arr[1], name: arr[2], jsPropName: runtime.GetJsPropName(arr[3]) })); this._behaviorsCount = data[4]; this._effectsCount = data[5]; this._isWorldType = this._plugin.IsWorldType(); this._effectList = null; this._collisionGrid = C3.New(C3.SparseGrid, runtime.GetOriginalViewportWidth(), runtime.GetOriginalViewportHeight()); this._anyCollisionCellChanged = true; this._anyInstanceParallaxed = false; this._familyMembers = null; this._familyMembersSet = null; this._familyIndex = -1; this._families = null; this._familiesSet = null; this._familyInstVarMap = null; this._familyBehaviorMap = null; this._familyEffectMap = null; this._isInContainer = false; this._container = null; this._behaviorTypes = data[8].map(behaviorTypeData=>C3.BehaviorType.Create(this, behaviorTypeData)); this._behaviorTypesIncludingInherited = []; this._behaviorsByName = new Map; this._behaviorNameToIndex = new Map; this._usedBehaviorCtors = new Set; this._solStack = C3.New(C3.SolStack, this); this._defaultInstanceData = null; this._defaultLayerIndex = 0; this._isContained = false; this._container = null; this._imageInfo = null; this._animations = null; this._animationsByName = null; this._animationsBySid = null; this._textureRefCount = 0; this._savedData = new Map; this._unsavedData = new Map; this._instances = []; this._iidsStale = true; if (this._plugin.HasEffects()) this._effectList = C3.New(C3.EffectList, this, data[12]); if (data[6]) { this._imageInfo = C3.New(C3.ImageInfo); this._imageInfo.LoadData(data[6]) } if (data[7]) { this._animations = data[7].map(animData=>C3.New(C3.AnimationInfo, animData)); this._animationsByName = new Map; this._animationsBySid = new Map; for (const anim of this._animations) { this._animationsByName.set(anim.GetName().toLowerCase(), anim); this._animationsBySid.set(anim.GetSID(), anim) } } if (this._isFamily) { this._familyMembers = []; this._familyMembersSet = new Set; this._familyIndex = this._runtime._GetNextFamilyIndex() } else { this._families = []; this._familiesSet = new Set; this._familyInstVarMap = []; this._familyBehaviorMap = []; this._familyEffectMap = [] } this._sdkType = C3.New(PluginCtor.Type, this, data[15]); this._iObjectClass = null; this._instanceUserScriptClass = null; this._userScriptDispatcher = C3.New(C3.Event.Dispatcher); const CustomScriptClass = this._sdkType.GetScriptInterfaceClass(); if (CustomScriptClass) { this._iObjectClass = new CustomScriptClass(this); if (!(this._iObjectClass instanceof IObjectClass)) throw new TypeError("script interface class must derive from IObjectClass"); } else this._iObjectClass = new IObjectClass(this); if (data[13]) { const tilemapData = data[13]; if (tilemapData) { const tilePolyData = tilemapData[0]; const maxTileIndex = tilemapData[1]; this._sdkType.LoadTilemapData(tilePolyData, maxTileIndex) } } if (!this._runtime.UsesLoaderLayout() || this._isFamily || this._isOnLoaderLayout || !this._isWorldType) this.OnCreate(); if (this._plugin.IsSingleGlobal()) { this._plugin._SetSingleGlobalObjectClass(this); this._CreateSingleGlobalInstance(data) } } static Create(runtime, index, objectClassData) { return C3.New(C3.ObjectClass, runtime, index, objectClassData) } Release() { if (this._imageInfo) { this._imageInfo.Release(); this._imageInfo = null } if (this._animations) { for (const a of this._animations) a.Release(); C3.clearArray(this._animations); this._animationsByName.clear(); this._animationsBySid.clear() } this._solStack.Release(); this._solStack = null; this._savedData.clear(); this._unsavedData.clear(); this._container = null; this._runtime = null } _LoadFamily(familyData) { for (let i = 1, len = familyData.length; i < len; ++i) { const memberType = this._runtime.GetObjectClassByIndex(familyData[i]); this._familyMembers.push(memberType); this._familyMembersSet.add(memberType); memberType._families.push(this); memberType._familiesSet.add(this) } } _SetContainer(container) { this._isInContainer = true; this._container = container } IsInContainer() { return this._isInContainer } GetContainer() { return this._container } _OnAfterCreate() { let index = 0; if (!this._isFamily) for (const family of this._families) for (const familyBehType of family.GetBehaviorTypes()) { const lowerName = familyBehType.GetName().toLowerCase(); this._behaviorsByName.set(lowerName, familyBehType); this._behaviorNameToIndex.set(lowerName, index); this._behaviorTypesIncludingInherited.push(familyBehType); ++index } for (const behaviorType of this.GetBehaviorTypes()) { const lowerName = behaviorType.GetName().toLowerCase(); this._behaviorsByName.set(lowerName, behaviorType); this._behaviorNameToIndex.set(lowerName, index); this._behaviorTypesIncludingInherited.push(behaviorType); ++index } for (const behaviorType of this._behaviorTypesIncludingInherited) this._usedBehaviorCtors.add(behaviorType.GetBehavior().constructor); if (!this._isFamily && this._families.length) { const familyCount = this._runtime.GetFamilyCount(); C3.extendArray(this._familyInstVarMap, familyCount, 0); C3.extendArray(this._familyBehaviorMap, familyCount, 0); C3.extendArray(this._familyEffectMap, familyCount, 0); const allFx = []; let ivSum = 0; let behSum = 0; let fxSum = 0; for (const family of this._families) { const familyIndex = family.GetFamilyIndex(); this._familyInstVarMap[familyIndex] = ivSum; ivSum += family.GetInstanceVariablesCount(); this._familyBehaviorMap[familyIndex] = behSum; behSum += family.GetBehaviorTypesCount(); this._familyEffectMap[familyIndex] = fxSum; fxSum += family.GetEffectTypesCount(); const familyEffectList = family.GetEffectList(); if (familyEffectList && this._effectList) for (const effectType of familyEffectList.GetAllEffectTypes()) allFx.push(effectType.Clone(this._effectList)) } if (this._effectList) this._effectList.PrependEffectTypes(allFx) } } _CreateSingleGlobalInstance(data) { const uid = this._runtime._GetNewUID(); const inst = C3.New(C3.Instance, { runtime: this._runtime, objectType: this, uid: uid }); inst._CreateSdkInstance(data[16], []); this._runtime._MapInstanceByUID(uid, inst); this._instances.push(inst) } GetSdkType() { return this._sdkType } IsOnLoaderLayout() { return this._isOnLoaderLayout } OnCreate() { if (!this._isFamily) this._sdkType.OnCreate() } HasLoadedTextures() { return this._textureRefCount > 0 } LoadTextures(renderer) { if (this._isFamily) return Promise.resolve(); this._textureRefCount++; if (this._textureRefCount === 1) return this._sdkType.LoadTextures(renderer) || Promise.resolve(); else return Promise.resolve() } ReleaseTextures() { if (this._isFamily) return; this._textureRefCount--; if (this._textureRefCount < 0) throw new Error("released textures too many times"); if (this._textureRefCount === 0) this._sdkType.ReleaseTextures() } OnDynamicTextureLoadComplete() { if (this._isFamily) throw new Error("not applicable to family"); this._sdkType.OnDynamicTextureLoadComplete() } PreloadTexturesWithInstances(renderer) { if (this._isFamily) return Promise.resolve(); return this._sdkType.PreloadTexturesWithInstances(renderer) } GetRuntime() { return this._runtime } GetPlugin() { return this._plugin } GetInstanceSdkCtor() { return this._instSdkCtor } GetName() { return this._name } GetJsPropName() { return this._jsPropName } GetIndex() { return this._index } GetSID() { return this._sid } IsFamily() { return this._isFamily } IsGlobal() { return this._isGlobal } IsWorldType() { return this._isWorldType } GetFamilyIndex() { return this._familyIndex } GetBehaviorTypes() { return this._behaviorTypes } GetBehaviorTypesCount() { return this._behaviorsCount } UsesBehaviorByCtor(Ctor) { return Ctor && this._usedBehaviorCtors.has(Ctor) } GetInstanceVariablesCount() { return this._instVars.length } GetInstanceVariableSIDs() { return this._instVars.map(iv=>iv.sid) } GetInstanceVariableIndexBySID(sid) { return this._instVars.findIndex(iv=>iv.sid === sid) } GetInstanceVariableIndexByName(name) { return this._instVars.findIndex(iv=>iv.name === name) } _GetAllInstanceVariableNames() { return this._instVars.map(iv=>iv.name) } _GetAllInstanceVariableJsPropNames() { return this._instVars.map(iv=>iv.jsPropName) } GetInstanceVariableType(i) { i = Math.floor(i); if (i < 0 || i >= this._instVars.length) throw new RangeError("invalid instance variable index"); return this._instVars[i].type } GetInstanceVariableName(i) { i = Math.floor(i); if (i < 0 || i >= this._instVars.length) throw new RangeError("invalid instance variable index"); return this._instVars[i].name } GetEffectTypesCount() { return this._effectsCount } GetBehaviorTypesIncludingInherited() { return this._behaviorTypesIncludingInherited } GetBehaviorTypeByName(name) { return this._behaviorsByName.get(name.toLowerCase()) || null } GetBehaviorIndexByName(name) { const ret = this._behaviorNameToIndex.get(name.toLowerCase()); if (typeof ret === "undefined") return -1; else return ret } GetEffectList() { return this._effectList } HasEffects() { return this._plugin.HasEffects() } UsesEffects() { return this._effectList && this._effectList.HasAnyEffectType() } GetSolStack() { return this._solStack } GetCurrentSol() { return this._solStack.GetCurrentSol() } GetImageInfo() { return this._imageInfo } SetDefaultInstanceData(d) { this._defaultInstanceData = d } GetDefaultInstanceData() { return this._defaultInstanceData } _SetDefaultLayerIndex(i) { this._defaultLayerIndex = i } GetDefaultLayerIndex() { return this._defaultLayerIndex } GetAnimations() { return this._animations } GetAnimationCount() { return this._animations.length } GetFamilies() { return this._families } BelongsToFamily(family) { return this._familiesSet.has(family) } GetFamilyMembers() { return this._familyMembers } FamilyHasMember(objectType) { return this._familyMembersSet.has(objectType) } GetFamilyBehaviorOffset(familyIndex) { return this._familyBehaviorMap[familyIndex] } GetFamilyInstanceVariableOffset(familyIndex) { return this._familyInstVarMap[familyIndex] } GetAnimationByName(name) { if (!this._animations) throw new Error("no animations"); return this._animationsByName.get(name.toLowerCase()) || null } GetAnimationBySID(sid) { if (!this._animations) throw new Error("no animations"); return this._animationsBySid.get(sid) || null } GetFirstAnimationFrame() { if (!this._animations) throw new Error("no animations"); return this._animations[0].GetFrameAt(0) } GetDefaultInstanceSize() { if (this._animations) { const firstFrameInfo = this.GetFirstAnimationFrame().GetImageInfo(); return [firstFrameInfo.GetWidth(), firstFrameInfo.GetHeight()] } else if (this._imageInfo) return [this._imageInfo.GetWidth(), this._imageInfo.GetHeight()]; else return [100, 100] } GetSingleGlobalInstance() { if (!this._plugin.IsSingleGlobal()) throw new Error("not a single-global plugin"); return this._instances[0] } GetInstances() { return this._instances } *instances() { yield*this._instances } *instancesIncludingPendingCreate() { yield*this._instances; for (const inst of this._runtime._GetInstancesPendingCreate()) if (inst.GetObjectClass() === this) yield inst } GetInstanceCount() { return this._instances.length } _AddInstance(inst) { this._instances.push(inst) } _SetIIDsStale() { this._iidsStale = true } _UpdateIIDs() { if (!this._iidsStale || this._isFamily) return; const instances = this._instances; let i = 0; for (let len = instances.length; i < len; ++i) instances[i]._SetIID(i); const instancesPendingCreate = this._runtime._GetInstancesPendingCreate(); for (const inst of instancesPendingCreate) if (inst.GetObjectClass() === this) inst._SetIID(i++); this._iidsStale = false } GetInstanceByIID(i) { const instances = this._instances; if (i < instances.length) return instances[i]; i -= instances.length; const instancesPendingCreate = this._runtime._GetInstancesPendingCreate(); for (const inst of instancesPendingCreate) if (inst.GetObjectClass() === this) { if (i === 0) return inst; --i } return null } GetFirstPicked(fromInst) { if (fromInst && fromInst.IsInContainer() && fromInst.GetObjectClass() !== this) for (const s of fromInst.siblings()) if (s.GetObjectClass() === this) return s; const instances = this.GetCurrentSol().GetInstances(); if (instances.length) return instances[0]; else return null } GetPairedInstance(inst) { const instances = this.GetCurrentSol().GetInstances(); if (instances.length) return instances[inst.GetIID() % instances.length]; else return null } *allCorrespondingInstances(inst, objectClass) { const myInstances = this.GetCurrentSol().GetInstances(); const myInstanceCount = myInstances.length; const otherSol = objectClass.GetCurrentSol(); const otherInstances = objectClass.GetCurrentSol().GetInstances(); const otherInstanceCount = otherInstances.length; let index = inst.GetIID(); if (objectClass.IsFamily() || !otherSol.IsSelectAll()) index = otherInstances.indexOf(inst); const divisor = Math.ceil(myInstanceCount / otherInstanceCount); const remainder = myInstanceCount % otherInstanceCount; let startIndex = 0; let correspondCount = 0; if (remainder === 0 || index < remainder) { startIndex = index * divisor; correspondCount = divisor } else { startIndex = remainder * divisor + (index - remainder) * (divisor - 1); correspondCount = divisor - 1 } for (let i = startIndex, end = startIndex + correspondCount; i < end; ++i) yield myInstances[i] } FinishCondition(f) { this._sdkType.FinishCondition(f) } ApplySolToContainer() { if (!this._isInContainer || this._isFamily) return; this._UpdateIIDs(); const sol1 = this.GetCurrentSol(); const sol1instances = sol1._GetOwnInstances(); const selectAll = sol1.IsSelectAll(); const es = this._runtime.GetCurrentEventStackFrame(); const isOrBlock = es && es.GetCurrentEvent() && es.GetCurrentEvent().IsOrBlock(); for (const containerType of this._container.objectTypes()) { if (containerType === this) continue; containerType._UpdateIIDs(); const sol2 = containerType.GetCurrentSol(); sol2._SetSelectAll(selectAll); if (!selectAll) { const sol2instances = sol2._GetOwnInstances(); C3.clearArray(sol2instances); for (const inst of sol1instances) sol2instances.push(containerType.GetInstanceByIID(inst.GetIID())); if (isOrBlock) { const sol1elseInstances = sol1._GetOwnElseInstances(); const sol2elseInstances = sol2._GetOwnElseInstances(); C3.clearArray(sol2elseInstances); for (const inst of sol1elseInstances) sol2elseInstances.push(containerType.GetInstanceByIID(inst.GetIID())) } } } } _TruncateContainerSols(useElseInstances, i) { for (const containerType of this.GetContainer().objectTypes()) { const sol = containerType.GetCurrentSol(); if (useElseInstances) C3.truncateArray(sol._GetOwnElseInstances(), i); else C3.truncateArray(sol._GetOwnInstances(), i) } } _GetCollisionCellGrid() { return this._collisionGrid } _SetAnyCollisionCellChanged(c) { this._anyCollisionCellChanged = !!c } _SetAnyInstanceParallaxed(p) { this._anyInstanceParallaxed = !!p } IsAnyInstanceParallaxed() { return this._anyInstanceParallaxed } _UpdateAllCollisionCells() { if (!this._anyCollisionCellChanged || !this._isWorldType) return; for (const inst of this._instances) inst.GetWorldInfo()._UpdateCollisionCell(); for (const inst of this._runtime._GetInstancesPendingCreate()) if (inst.GetObjectClass() === this) inst.GetWorldInfo()._UpdateCollisionCell(); this._anyCollisionCellChanged = false } GetSavedDataMap() { if (!this._savedData) this._savedData = new Map; return this._savedData } GetUnsavedDataMap() { if (!this._unsavedData) this._unsavedData = new Map; return this._unsavedData } HasSolidBehavior() { return this.UsesBehaviorByCtor(C3.Behaviors.solid) } HasNoSaveBehavior() { return this.UsesBehaviorByCtor(C3.Behaviors.NoSave) } HasPersistBehavior() { return this.UsesBehaviorByCtor(C3.Behaviors.Persist) } _SaveToJson() { const o = { "instances": this._instances.map(inst=>inst.SaveToJson()) }; if (this._savedData && this._savedData.size) o["ex"] = C3.ToSuperJSON(this._savedData); return o } _LoadFromJson(o) { if (this._savedData) { this._savedData.clear(); this._savedData = null } const ex = o["ex"]; if (ex) this._savedData = C3.FromSuperJSON(ex); const existingInstances = this._instances; const loadInstances = o["instances"]; for (let i = 0, len = Math.min(existingInstances.length, loadInstances.length); i < len; ++i) existingInstances[i].LoadFromJson(loadInstances[i]); for (let i = loadInstances.length, len = existingInstances.length; i < len; ++i) this._runtime.DestroyInstance(existingInstances[i]); for (let i = existingInstances.length, len = loadInstances.length; i < len; ++i) { const data = loadInstances[i]; let layer = null; if (this.IsWorldType()) { layer = this._runtime.GetMainRunningLayout().GetLayerBySID(data["w"]["l"]); if (!layer) continue } const inst = this._runtime.CreateInstanceFromData(this._defaultInstanceData || this, layer, false, 0, 0, true); inst.LoadFromJson(data) } this._SetIIDsStale() } GetIObjectClass() { return this._iObjectClass } UserScriptDispatcher() { return this._userScriptDispatcher } _GetUserScriptInstanceClass() { return this._instanceUserScriptClass } _SetUserScriptInstanceClass(Class) { this._instanceUserScriptClass = Class } DispatchUserScriptEvent(e) { const runtime = this._runtime; const shouldTime = runtime.IsDebug() && !runtime.GetEventSheetManager().IsInEventEngine(); if (shouldTime) C3Debugger.StartMeasuringScriptTime(); this._userScriptDispatcher.dispatchEvent(e); if (shouldTime) C3Debugger.AddScriptTime() } } } ;'use strict'; { const C3 = self.C3; C3.Container = class Container extends C3.DefendedBase { constructor(runtime, objectTypes) { super(); this._runtime = runtime; this._objectTypes = objectTypes; for (const objectType of this._objectTypes) objectType._SetContainer(this) } Release() { this._runtime = null } GetRuntime() { return this._runtime } GetObjectTypes() { return this._objectTypes } objectTypes() { return this._objectTypes } HasAnyWorldType() { return this._objectTypes.some(o=>o.IsWorldType()) } } } ;'use strict'; { const C3 = self.C3; const C3Debugger = self.C3Debugger; const IInstance = self.IInstance; const EMPTY_ARRAY = []; let nextPuid = 0; const savedDataMaps = new WeakMap; const unsavedDataMaps = new WeakMap; const FLAG_DESTROYED = 1 << 0; const FLAG_TILEMAP = 1 << 1; const FLAG_MUST_PREDRAW = 1 << 2; const FLAG_SOLID_ENABLED = 1 << 3; const FLAG_JUMPTHRU_ENABLED = 1 << 4; C3.Instance = class Instance extends C3.DefendedBase { constructor(opts) { super(); this._runtime = opts.runtime; this._objectType = opts.objectType; this._worldInfo = null; this._sdkInst = null; this._iScriptInterface = null; this._iid = 0; this._uid = opts.uid; this._puid = nextPuid++; this._flags = 0; this._instVarValues = EMPTY_ARRAY; this._behaviorInstances = EMPTY_ARRAY; const behaviorTypes = this._objectType.GetBehaviorTypesIncludingInherited(); if (behaviorTypes.length > 0) this._behaviorInstances = behaviorTypes.map((behaviorType,index)=>C3.New(C3.BehaviorInstance, { runtime: this._runtime, behaviorType: behaviorType, instance: this, index })); this._siblings = this._objectType.IsInContainer() ? [] : null; this._timeScale = -1; this._dispatcher = null; const plugin = this.GetPlugin(); if (plugin.MustPreDraw()) this._flags |= FLAG_MUST_PREDRAW; if (plugin.IsWorldType()) { this._worldInfo = C3.New(C3.WorldInfo, this, opts.layer); if (opts.worldData) this._worldInfo.Init(opts.worldData); else { this._worldInfo.InitNoData(); const [width,height] = this._objectType.GetDefaultInstanceSize(); this._worldInfo.SetSize(width, height); if (this.GetObjectClass().UsesEffects()) this._worldInfo.GetInstanceEffectList().LoadDefaultEffectParameters() } } if (opts.instVarData) this._LoadInstanceVariableData(opts.instVarData); else this._LoadDefaultInstanceVariables() } Release() { if (this._iScriptInterface) { this._iScriptInterface._Release(); this._iScriptInterface = null } if (this._behaviorInstances.length > 0) { for (const behInst of this._behaviorInstances) behInst.Release(); C3.clearArray(this._behaviorInstances) } this._sdkInst.Release(); this._sdkInst = null; const savedData = savedDataMaps.get(this); if (savedData) { savedData.clear(); savedDataMaps.delete(this) } const unsavedData = unsavedDataMaps.get(this); if (unsavedData) { unsavedData.clear(); unsavedDataMaps.delete(this) } if (this._siblings) C3.clearArray(this._siblings); if (this._dispatcher) { this._dispatcher.Release(); this._dispatcher = null } this._runtime = null; this._objectType = null; if (this._instVarValues.length > 0) C3.clearArray(this._instVarValues); if (this._worldInfo) { this._worldInfo.Release(); this._worldInfo = null } } _LoadInstanceVariableData(instVarData) { if (instVarData.length > 0) { this._instVarValues = []; C3.shallowAssignArray(this._instVarValues, instVarData) } } _LoadDefaultInstanceVariables() { const len = this._objectType.GetInstanceVariablesCount(); if (len === 0) return; this._instVarValues = []; const typeToInitValue = [0, 0, ""]; for (let i = 0; i < len; ++i) this._instVarValues.push(typeToInitValue[this._objectType.GetInstanceVariableType(i)]) } _CreateSdkInstance(properties, behInstProperties) { if (this._sdkInst) throw new Error("already got sdk instance"); for (let i = 0, len = this._behaviorInstances.length; i < len; ++i) { const behInst = this._behaviorInstances[i]; behInst._CreateSdkInstance(behInstProperties ? behInstProperties[i] : null) } this._sdkInst = C3.New(this._objectType.GetInstanceSdkCtor(), this, properties); if (!(this._sdkInst instanceof C3.SDKInstanceBase)) throw new Error("sdk type must derive from SDKInstanceBase"); for (let i = 0, len = this._behaviorInstances.length; i < len; ++i) this._behaviorInstances[i].PostCreate(); if (this._objectType._GetUserScriptInstanceClass()) this._InitUserScriptInterface() } GetSdkInstance() { return this._sdkInst } GetWorldInfo() { return this._worldInfo } GetRuntime() { return this._runtime } GetTimeScale() { return this._timeScale } GetActiveTimeScale() { const ts = this._timeScale; if (ts === -1) return this.GetRuntime().GetTimeScale(); else return ts } SetTimeScale(ts) { ts = +ts; if (ts < 0 || !isFinite(ts)) ts = 0; this._timeScale = ts } RestoreTimeScale() { this._timeScale = -1 } Dispatcher() { if (!this._dispatcher) this._dispatcher = C3.New(C3.Event.Dispatcher); return this._dispatcher } Draw(renderer) { this._sdkInst.Draw(renderer) } OnCreate(properties) { this._sdkInst.OnCreate(properties) } _SetHasTilemap() { this._flags |= FLAG_TILEMAP } HasTilemap() { return (this._flags & FLAG_TILEMAP) !== 0 } _MarkDestroyed() { this._flags |= FLAG_DESTROYED } IsDestroyed() { return (this._flags & FLAG_DESTROYED) !== 0 } MustPreDraw() { return (this._flags & FLAG_MUST_PREDRAW) !== 0 } _IsSolidEnabled() { return (this._flags & FLAG_SOLID_ENABLED) !== 0 } _SetSolidEnabled(e) { if (e) this._flags |= FLAG_SOLID_ENABLED; else this._flags &= ~FLAG_SOLID_ENABLED } _IsJumpthruEnabled() { return (this._flags & FLAG_JUMPTHRU_ENABLED) !== 0 } _SetJumpthruEnabled(e) { if (e) this._flags |= FLAG_JUMPTHRU_ENABLED; else this._flags &= ~FLAG_JUMPTHRU_ENABLED } SetFlag(bit, enable) { bit <<= 16; if (enable) this._flags |= bit; else this._flags &= ~bit } GetFlag(bit) { return (this._flags & bit << 16) !== 0 } GetCurrentImageInfo() { return this._sdkInst.GetCurrentImageInfo() } GetCurrentSurfaceSize() { return this._sdkInst.GetCurrentSurfaceSize() } GetCurrentTexRect() { return this._sdkInst.GetCurrentTexRect() } GetImagePoint(nameOrIndex) { return this._sdkInst.GetImagePoint(nameOrIndex) } GetObjectClass() { return this._objectType } BelongsToObjectClass(objectClass) { if (objectClass.IsFamily()) return objectClass.FamilyHasMember(this.GetObjectClass()); else return this.GetObjectClass() === objectClass } VerifySupportsSceneGraph() { if (!this.GetPlugin().SupportsSceneGraph()) throw new Error("object does not support scene graph"); } HasParent() { return this.GetParent() !== null } GetParent() { const wi = this.GetWorldInfo(); if (!wi) return null; const parentWi = wi.GetParent(); return parentWi ? parentWi.GetInstance() : null } GetTopParent() { const wi = this.GetWorldInfo(); if (!wi) return null; const parentWi = wi.GetTopParent(); return parentWi ? parentWi.GetInstance() : null } *parents() { const wi = this.GetWorldInfo(); if (!wi) return; for (const parentWi of wi.parents()) yield parentWi.GetInstance() } HasChildren() { const wi = this.GetWorldInfo(); return wi ? wi.HasChildren() : false } GetChildren() { const wi = this.GetWorldInfo(); if (!wi) return []; return wi.GetChildren().map(wi=>wi.GetInstance()) } *children() { const wi = this.GetWorldInfo(); if (!wi) return; for (const childWi of wi.children()) yield childWi.GetInstance() } *allChildren() { const wi = this.GetWorldInfo(); if (!wi) return; for (const childWi of wi.allChildren()) yield childWi.GetInstance() } GetChildCount() { const wi = this.GetWorldInfo(); return wi ? wi.GetChildCount() : 0 } GetChildAt(index) { const wi = this.GetWorldInfo(); if (!wi) return null; const childWi = wi.GetChildAt(index); return childWi ? childWi.GetInstance() : null } AddChild(childInst, opts) { this.VerifySupportsSceneGraph(); childInst.VerifySupportsSceneGraph(); this.GetWorldInfo().AddChild(childInst.GetWorldInfo(), opts || {}) } RemoveChild(childInst) { const wi = this.GetWorldInfo(); if (!wi) return; wi.RemoveChild(childInst.GetWorldInfo()) } GetDestroyWithParent() { const wi = this.GetWorldInfo(); return wi ? wi.GetDestroyWithParent() : false } SetupInitialSceneGraphConnections() { const wi = this.GetWorldInfo(); if (!wi) return; const childrenData = wi.GetSceneGraphChildrenExportData(); if (!childrenData) return; for (const childData of childrenData) { const child = this._runtime.GetInstanceByUID(childData[0]); if (child) { const flags = childData[1]; this.AddChild(child, { transformX: !!(flags >> 0 & 1), transformY: !!(flags >> 1 & 1), transformWidth: !!(flags >> 2 & 1), transformHeight: !!(flags >> 3 & 1), transformAngle: !!(flags >> 4 & 1), destroyWithParent: !!(flags >> 5 & 1), transformZElevation: !!(flags >> 6 & 1) }) } } } IsInContainer() { return this._siblings !== null } _AddSibling(inst) { this._siblings.push(inst) } GetSiblings() { return this._siblings } siblings() { return this._siblings } SetSiblingsSinglePicked() { for (const s of this.siblings()) s.GetObjectClass().GetCurrentSol().SetSinglePicked(s) } _PushSiblingsToSolInstances() { for (const s of this.siblings()) s.GetObjectClass().GetCurrentSol()._PushInstance(s) } _SetSiblingsToSolInstancesIndex(i) { for (const s of this.siblings()) s.GetObjectClass().GetCurrentSol()._GetOwnInstances()[i] = s } _PushSiblingsToSolElseInstances() { for (const s of this.siblings()) s.GetObjectClass().GetCurrentSol()._PushElseInstance(s) } _SetSiblingsToSolElseInstancesIndex(i) { for (const s of this.siblings()) s.GetObjectClass().GetCurrentSol()._GetOwnElseInstances()[i] = s } GetPlugin() { return this._objectType.GetPlugin() } _SetIID(i) { this._iid = i } GetIID() { this._objectType._UpdateIIDs(); return this._iid } GetUID() { return this._uid } GetPUID() { return this._puid } GetBehaviorInstances() { return this._behaviorInstances } GetBehaviorInstanceFromCtor(ctor) { if (!ctor) return null; for (const behInst of this._behaviorInstances) if (behInst.GetBehavior()instanceof ctor) return behInst; return null } GetBehaviorSdkInstanceFromCtor(ctor) { if (!ctor) return null; const behInst = this.GetBehaviorInstanceFromCtor(ctor); if (behInst) return behInst.GetSdkInstance(); else return null } GetBehaviorIndexBySID(sid) { const behaviorInstances = this._behaviorInstances; for (let i = 0, len = behaviorInstances.length; i < len; ++i) if (behaviorInstances[i].GetBehaviorType().GetSID() === sid) return i; return -1 } GetAllInstanceVariableValues() { return this._instVarValues } _GetAllInstanceVariableNames() { return this._objectType._GetAllInstanceVariableNames() } GetInstanceVariableCount() { return this._instVarValues.length } GetInstanceVariableValue(index) { index = index | 0; const instVarValues = this._instVarValues; if (index < 0 || index >= instVarValues.length) throw new RangeError("invalid instance variable"); return instVarValues[index] } _GetInstanceVariableValueUnchecked(index) { return this._instVarValues[index] } SetInstanceVariableValue(index, value) { index = index | 0; const instVarValues = this._instVarValues; if (index < 0 || index >= instVarValues.length) throw new RangeError("invalid instance variable"); const lastValue = instVarValues[index]; if (typeof lastValue === "number") if (typeof value === "number") instVarValues[index] = value; else instVarValues[index] = parseFloat(value); else if (typeof lastValue === "boolean") if (typeof value === "boolean") instVarValues[index] = value; else instVarValues[index] = !!value; else if (typeof lastValue === "string") if (typeof value === "string") instVarValues[index] = value; else instVarValues[index] = value.toString(); else throw new Error("unknown instance variable type"); } SetInstanceVariableOffset(index, offset) { if (offset === 0) return; index = index | 0; const instVarValues = this._instVarValues; if (index < 0 || index >= instVarValues.length) throw new RangeError("invalid instance variable"); const lastValue = instVarValues[index]; if (typeof lastValue === "number") if (typeof offset === "number") instVarValues[index] += offset; else instVarValues[index] += parseFloat(offset); else if (typeof lastValue === "boolean") throw new Error("can not set offset of boolean variable"); else if (typeof lastValue === "string") throw new Error("can not set offset of string variable"); else throw new Error("unknown instance variable type"); } GetSavedDataMap() { let ret = savedDataMaps.get(this); if (ret) return ret; ret = new Map; savedDataMaps.set(this, ret); return ret } GetUnsavedDataMap() { let ret = unsavedDataMaps.get(this); if (ret) return ret; ret = new Map; unsavedDataMaps.set(this, ret); return ret } _HasAnyCreateDestroyHandler(name) { const objectType = this.GetObjectClass(); if (objectType.UserScriptDispatcher().HasAnyHandlerFor(name)) return true; for (const family of objectType.GetFamilies()) if (family.UserScriptDispatcher().HasAnyHandlerFor(name)) return true; if (this._runtime.UserScriptDispatcher().HasAnyHandlerFor(name)) return true; return false } _TriggerOnCreated() { if (this._HasAnyCreateDestroyHandler("instancecreate")) { const objectType = this.GetObjectClass(); const instCreateEvent = new C3.Event("instancecreate"); instCreateEvent.instance = this.GetInterfaceClass(); objectType.DispatchUserScriptEvent(instCreateEvent); for (const family of objectType.GetFamilies()) family.DispatchUserScriptEvent(instCreateEvent); this._runtime.DispatchUserScriptEvent(instCreateEvent) } this._runtime.Trigger(this.GetPlugin().constructor.Cnds.OnCreated, this, null) } _TriggerOnDestroyed() { this._runtime.Trigger(this.GetPlugin().constructor.Cnds.OnDestroyed, this, null) } _FireDestroyedScriptEvents(isEndingLayout) { if (this._iScriptInterface) { const e = new C3.Event("destroy"); e.isEndingLayout = isEndingLayout; this.DispatchUserScriptEvent(e) } if (!this._HasAnyCreateDestroyHandler("instancedestroy")) return; const objectType = this.GetObjectClass(); const instDestroyEvent = new C3.Event("instancedestroy"); instDestroyEvent.instance = this.GetInterfaceClass(); instDestroyEvent.isEndingLayout = isEndingLayout; objectType.DispatchUserScriptEvent(instDestroyEvent); for (const family of objectType.GetFamilies()) family.DispatchUserScriptEvent(instDestroyEvent); this._runtime.DispatchUserScriptEvent(instDestroyEvent) } _GetDebuggerProperties() { return this._sdkInst.GetDebuggerProperties() } SaveToJson(mode="full") { const o = {}; if (mode === "full") o["uid"] = this.GetUID(); else o["c3"] = true; if (mode !== "visual-state") { const savedData = savedDataMaps.get(this); if (savedData && savedData.size) o["ex"] = C3.ToSuperJSON(savedData); if (this.GetTimeScale() !== -1) o["mts"] = this.GetTimeScale(); if (this._objectType.GetInstanceVariablesCount() > 0) { const ivs = {}; const ivSids = this._objectType.GetInstanceVariableSIDs(); for (let i = 0, len = this._instVarValues.length; i < len; ++i) ivs[ivSids[i].toString()] = this._instVarValues[i]; o["ivs"] = ivs } if (this._behaviorInstances.length) { const behs = {}; for (const behInst of this._behaviorInstances) { const data = behInst.SaveToJson(); if (data) behs[behInst.GetBehaviorType().GetSID().toString()] = data } o["behs"] = behs } } if (this._worldInfo) o["w"] = this._worldInfo._SaveToJson(); const ownData = this._sdkInst.SaveToJson(); if (ownData) o["data"] = ownData; return o } LoadFromJson(o, mode="full") { if (mode === "full") this._uid = o["uid"]; else if (!o["c3"]) return; if (mode !== "visual-state") { let savedData = savedDataMaps.get(this); if (savedData) { savedData.clear(); savedDataMaps.delete(this) } const ex = o["ex"]; if (ex) { savedData = C3.FromSuperJSON(ex); savedDataMaps.set(this, savedData) } this._timeScale = o.hasOwnProperty("mts") ? o["mts"] : -1; const ivs = o["ivs"]; if (ivs) for (const [sidStr,value] of Object.entries(ivs)) { const sid = parseInt(sidStr, 10); const index = this._objectType.GetInstanceVariableIndexBySID(sid); if (index < 0 || index >= this._instVarValues.length) continue; let v = value; if (v === null) v = NaN; this._instVarValues[index] = v } } if (this.GetPlugin().IsWorldType()) { const worldData = o["w"]; const layerSid = worldData["l"]; if (this._worldInfo.GetLayer().GetSID() !== layerSid) { const oldLayer = this._worldInfo.GetLayer(); const newLayer = oldLayer.GetLayout().GetLayerBySID(layerSid); if (newLayer) { this._worldInfo._SetLayer(newLayer); oldLayer._RemoveInstance(this, true); newLayer._AddInstance(this, true); newLayer.SetZIndicesChanged(); this._worldInfo.SetBboxChanged() } else if (mode === "full") this._runtime.DestroyInstance(this) } this._worldInfo._LoadFromJson(worldData) } if (mode !== "visual-state") { const behs = o["behs"]; if (behs) for (const [sidStr,data] of Object.entries(behs)) { const sid = parseInt(sidStr, 10); const index = this.GetBehaviorIndexBySID(sid); if (index < 0 || index >= this._behaviorInstances.length) continue; this._behaviorInstances[index].LoadFromJson(data) } } const ownData = o["data"]; if (ownData) this._sdkInst.LoadFromJson(ownData) } GetInterfaceClass() { return this._iScriptInterface || this._InitUserScriptInterface() } _InitUserScriptInterface() { const DefaultScriptClass = this._worldInfo ? self.IWorldInstance : IInstance; const SdkScriptClass = this._sdkInst.GetScriptInterfaceClass(); const UserScriptClass = this._objectType._GetUserScriptInstanceClass(); const ScriptInterfaceClass = UserScriptClass || SdkScriptClass || DefaultScriptClass; IInstance._Init(this); this._iScriptInterface = new ScriptInterfaceClass; IInstance._Init(null); if (SdkScriptClass && !(this._iScriptInterface instanceof DefaultScriptClass)) throw new TypeError(`script interface class '${SdkScriptClass.name}' does not extend the right base class '${DefaultScriptClass.name}'`); if (UserScriptClass) { const ExpectedBaseClass = SdkScriptClass || DefaultScriptClass; if (!(this._iScriptInterface instanceof ExpectedBaseClass)) throw new TypeError(`setInstanceClass(): class '${UserScriptClass.name}' does not extend the right base class '${ExpectedBaseClass.name}'`); } return this._iScriptInterface } _GetInstVarsScriptDescriptor(instDescriptors) { if (this._instVarValues.length === 0) return; const varDescriptors = {}; const instVarJsPropNames = this._objectType._GetAllInstanceVariableJsPropNames(); for (let i = 0, len = instVarJsPropNames.length; i < len; ++i) varDescriptors[instVarJsPropNames[i]] = { configurable: false, enumerable: true, get: C3.Instance.prototype._GetInstanceVariableValueUnchecked.bind(this, i), set: C3.Instance.prototype.SetInstanceVariableValue.bind(this, i) }; const instVarsObj = Object.create(Object.prototype, varDescriptors); instDescriptors.instVars = { value: instVarsObj, writable: false } } _GetBehaviorsScriptDescriptor(instDescriptors) { const behaviorInstances = this._behaviorInstances; if (behaviorInstances.length === 0) return; const behDescriptors = {}; for (const behInst of behaviorInstances) behDescriptors[behInst.GetBehaviorType().GetJsPropName()] = { value: behInst.GetScriptInterface(), writable: false }; const behaviorsObj = Object.create(Object.prototype, behDescriptors); instDescriptors.behaviors = { value: behaviorsObj, writable: false } } DispatchUserScriptEvent(e) { e.instance = this.GetInterfaceClass(); const runtime = this._runtime; const shouldTime = runtime.IsDebug() && !runtime.GetEventSheetManager().IsInEventEngine(); if (shouldTime) C3Debugger.StartMeasuringScriptTime(); this.GetInterfaceClass().dispatchEvent(e); if (shouldTime) C3Debugger.AddScriptTime() } } } ;'use strict'; { const C3 = self.C3; C3.SceneGraphInfo = class SceneGraphInfo extends C3.DefendedBase { constructor(owner) { super(); this._owner = owner; this._parent = null; this._children = []; this._myStartWidth = owner.GetWidth(); this._myStartHeight = owner.GetHeight(); this._parentStartAngle = 0 } Release() { this._parent = null; C3.clearArray(this._children) } SetParent(parent) { this._parent = parent; this._parentStartAngle = parent ? parent.GetAngle() : 0 } GetParent() { return this._parent } HasChildren() { return this._children.length > 0 } GetChildren() { return this._children } _GetStartWidth() { return this._myStartWidth } _GetStartHeight() { return this._myStartHeight } GetParentScaleX() { if (this._owner.GetTransformWithParentWidth()) return this._parent.GetWidth() / this._parent._GetSceneGraphInfo()._GetStartWidth(); else return 1 } GetParentScaleY() { if (this._owner.GetTransformWithParentHeight()) return this._parent.GetHeight() / this._parent._GetSceneGraphInfo()._GetStartHeight(); else return 1 } GetParentStartAngle() { return this._parentStartAngle } _SaveToJson() { return { "sw": this._myStartWidth, "sh": this._myStartHeight, "psa": this._parentStartAngle, "c": this._children.map(c=>{ let flagsStr = ""; if (c.GetTransformWithParentX()) flagsStr += "x"; if (c.GetTransformWithParentY()) flagsStr += "y"; if (c.GetTransformWithParentWidth()) flagsStr += "w"; if (c.GetTransformWithParentHeight()) flagsStr += "h"; if (c.GetTransformWithParentAngle()) flagsStr += "a"; if (c.GetTransformWithParentZElevation()) flagsStr += "z"; if (c.GetDestroyWithParent()) flagsStr += "d"; return { "uid": c.GetInstance().GetUID(), "f": flagsStr } } ) } } _LoadFromJson(o) { this._myStartWidth = o["sw"]; this._myStartHeight = o["sh"]; this._parentStartAngle = o["psa"] } _OnAfterLoad(o) { const owner = this._owner; const runtime = owner.GetRuntime(); for (const childData of o["c"]) { const childUid = childData["uid"]; const childInst = runtime.GetInstanceByUID(childUid); const childWi = childInst.GetWorldInfo(); const flagsStr = childData["f"]; const opts = {}; opts.transformX = flagsStr.includes("x"); opts.transformY = flagsStr.includes("y"); opts.transformWidth = flagsStr.includes("w"); opts.transformHeight = flagsStr.includes("h"); opts.transformAngle = flagsStr.includes("a"); opts.transformZElevation = flagsStr.includes("z"); opts.destroyWithParent = flagsStr.includes("d"); owner.AddChild(childWi, opts) } } } } ;'use strict'; { const C3 = self.C3; const tempRect = C3.New(C3.Rect); const tempQuad = C3.New(C3.Quad); const bboxChangeEvent = C3.New(C3.Event, "bboxchange", false); const tempColor = C3.New(C3.Color, 0, 0, 0, 0); const tempCollisionPoly = C3.New(C3.CollisionPoly); const DEFAULT_COLOR = C3.New(C3.Color, 1, 1, 1, 1); const DEFAULT_RENDER_CELLS = C3.New(C3.Rect, 0, 0, -1, -1); const DEFAULT_COLLISION_CELLS = C3.New(C3.Rect, 0, 0, -1, -1); const VALID_SET_MESH_POINT_MODES = new Set(["absolute", "relative"]); const EMPTY_ARRAY = []; let enableUpdateRendererStateGroup = true; const FLAG_IS_VISIBLE = 1 << 0; const FLAG_BBOX_CHANGED = 1 << 1; const FLAG_ENABLE_BBOX_CHANGED_EVENT = 1 << 2; const FLAG_COLLISION_ENABLED = 1 << 3; const FLAG_COLLISION_CELL_CHANGED = 1 << 4; const FLAG_SOLID_FILTER_INCLUSIVE = 1 << 5; const FLAG_HAS_ANY_ACTIVE_EFFECT = 1 << 6; const FLAG_IS_ROTATABLE = 1 << 7; const FLAG_DESTROY_WITH_PARENT = 1 << 8; const FLAG_TRANSFORM_WITH_PARENT_X = 1 << 9; const FLAG_TRANSFORM_WITH_PARENT_Y = 1 << 10; const FLAG_TRANSFORM_WITH_PARENT_W = 1 << 11; const FLAG_TRANSFORM_WITH_PARENT_H = 1 << 12; const FLAG_TRANSFORM_WITH_PARENT_A = 1 << 13; const FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION = 1 << 14; const MASK_ALL_SCENE_GRAPH_FLAGS = FLAG_DESTROY_WITH_PARENT | FLAG_TRANSFORM_WITH_PARENT_X | FLAG_TRANSFORM_WITH_PARENT_Y | FLAG_TRANSFORM_WITH_PARENT_W | FLAG_TRANSFORM_WITH_PARENT_H | FLAG_TRANSFORM_WITH_PARENT_A | FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION; const FLAG_MESH_CHANGED = 1 << 15; const FLAG_PHYSICS_BODY_CHANGED = 1 << 16; const FLAG_SIN_COS_ANGLE_CHANGED = 1 << 17; const FLAG_BLEND_MODE_BIT_OFFSET = 26; const FLAG_BLEND_MODE_MASK = 31 << FLAG_BLEND_MODE_BIT_OFFSET; C3.WorldInfo = class WorldInfo extends C3.DefendedBase { constructor(inst, layer) { super(); this._inst = inst; this._objectClass = inst.GetObjectClass(); this._runtime = inst.GetRuntime(); this._layer = layer; this._zIndex = -1; this._flags = FLAG_IS_VISIBLE | FLAG_BBOX_CHANGED | FLAG_COLLISION_ENABLED | FLAG_COLLISION_CELL_CHANGED | FLAG_MESH_CHANGED | FLAG_PHYSICS_BODY_CHANGED; if (this._objectClass.GetPlugin().IsRotatable()) this._flags |= FLAG_IS_ROTATABLE; this._x = NaN; this._y = NaN; this._zElevation = NaN; this._w = NaN; this._h = NaN; this._a = NaN; this._sinA = NaN; this._cosA = NaN; this._ox = NaN; this._oy = NaN; this._boundingBox = C3.New(C3.Rect); this._boundingQuad = C3.New(C3.Quad); this._collisionCells = DEFAULT_COLLISION_CELLS; this._renderCells = DEFAULT_RENDER_CELLS; this._sourceCollisionPoly = null; this._transformedPolyInfo = null; this._solidFilterTags = null; this._color = DEFAULT_COLOR; this._colorPremultiplied = DEFAULT_COLOR; this._stateGroup = null; this._instanceEffectList = null; if (this._inst.GetObjectClass().UsesEffects()) this._instanceEffectList = C3.New(C3.InstanceEffectList, this._inst, this); this._sceneGraphInfo = null; this._sceneGraphFlagsExportData = NaN; this._sceneGraphChildrenExportData = null; this._meshInfo = null } Release() { if (this._stateGroup) { this._runtime.GetRenderer().ReleaseStateGroup(this._stateGroup); this._stateGroup = null } this._sourceCollisionPoly = null; if (this._transformedPolyInfo) { this._transformedPolyInfo.poly.Release(); this._transformedPolyInfo = null } if (this._solidFilterTags) { this._solidFilterTags.clear(); this._solidFilterTags = null } this.ReleaseMesh(); if (this.HasParent()) this.GetParent().RemoveChild(this); if (this.HasChildren()) { const childrenToRelease = [...this.GetChildren()]; for (const child of childrenToRelease) this.RemoveChild(child) } this._ReleaseSceneGraphInfo(); this._inst = null; this._objectClass = null; this._runtime = null; this._layer = null } Init(data) { enableUpdateRendererStateGroup = false; this.SetXY(data[0], data[1]); this.SetZElevation(data[2]); this.SetSize(data[3], data[4]); if (this.IsRotatable()) this.SetAngle(data[6]); else this._a = 0; tempColor.setFromJSON(data[7]); this._SetColor(tempColor); this.SetOriginX(data[8]); this.SetOriginY(data[9]); this.SetBlendMode(data[10]); if (this._instanceEffectList) this._instanceEffectList._LoadEffectParameters(data[12]); if (data[14]) { this._sceneGraphFlagsExportData = data[14][0]; this._sceneGraphChildrenExportData = data[14][1] } enableUpdateRendererStateGroup = true; this._UpdateRendererStateGroup() } InitNoData() { this._x = 0; this._y = 0; this._zElevation = 0; this._w = 0; this._h = 0; this._a = 0; this._sinA = 0; this._cosA = 1; this._ox = 0; this._oy = 0; this._UpdateRendererStateGroup() } GetRuntime() { return this._runtime } GetObjectClass() { return this._objectClass } GetInstance() { return this._inst } _GetParentOffsetAngle() { if (this.GetTransformWithParentAngle()) return this.GetParent().GetAngle() - this._sceneGraphInfo.GetParentStartAngle(); else return 0 } SetX(x) { x = +x; if (this.GetTransformWithParentX()) { const sgi = this._sceneGraphInfo; const dx = x - this.GetX(); const da = -this._GetParentOffsetAngle(); if (da === 0) this._x += dx / sgi.GetParentScaleX(); else { this._x += Math.cos(da) * dx / sgi.GetParentScaleX(); if (this.GetTransformWithParentY()) this._y += Math.sin(da) * dx / sgi.GetParentScaleY() } } else this._x = x } OffsetX(x) { x = +x; if (this.GetTransformWithParentX()) this.SetX(this.GetX() + x); else this._x += x } GetX() { if (this.GetTransformWithParentX()) { let x = this._x; const sgi = this._sceneGraphInfo; const parent = this.GetParent(); const da = this._GetParentOffsetAngle(); if (da === 0) x *= sgi.GetParentScaleX(); else { x = x * sgi.GetParentScaleX() * Math.cos(da); if (this.GetTransformWithParentY()) x -= this._y * sgi.GetParentScaleY() * Math.sin(da) } return parent.GetX() + x } else return this._x } SetY(y) { y = +y; if (this.GetTransformWithParentY()) { const sgi = this._sceneGraphInfo; const dy = y - this.GetY(); const da = -this._GetParentOffsetAngle(); if (da === 0) this._y += dy / sgi.GetParentScaleY(); else { if (this.GetTransformWithParentX()) this._x -= Math.sin(da) * dy / sgi.GetParentScaleX(); this._y += Math.cos(da) * dy / sgi.GetParentScaleY() } } else this._y = y } OffsetY(y) { y = +y; if (this.GetTransformWithParentY()) this.SetY(this.GetY() + y); else this._y += y } GetY() { if (this.GetTransformWithParentY()) { let y = this._y; const sgi = this._sceneGraphInfo; const parent = this.GetParent(); const da = this._GetParentOffsetAngle(); if (da === 0) y *= sgi.GetParentScaleY(); else { y = y * sgi.GetParentScaleY() * Math.cos(da); if (this.GetTransformWithParentX()) y += this._x * sgi.GetParentScaleX() * Math.sin(da) } return parent.GetY() + y } else return this._y } SetXY(x, y) { x = +x; y = +y; if (this.GetTransformWithParentXOrY()) { const isTransformX = this.GetTransformWithParentX(); const isTransformY = this.GetTransformWithParentY(); const sgi = this._sceneGraphInfo; const dx = x - this.GetX(); const dy = y - this.GetY(); const da = -this._GetParentOffsetAngle(); if (da === 0) { if (isTransformX) this._x += dx / sgi.GetParentScaleX(); else this._x = x; if (isTransformY) this._y += dy / sgi.GetParentScaleY(); else this._y = y } else { const sinDa = Math.sin(da); const cosDa = Math.cos(da); if (isTransformX) if (isTransformY) this._x += (cosDa * dx - sinDa * dy) / sgi.GetParentScaleX(); else this._x += cosDa * dx / sgi.GetParentScaleX(); else this._x = x; if (isTransformY) if (isTransformX) this._y += (sinDa * dx + cosDa * dy) / sgi.GetParentScaleY(); else this._y += cosDa * dy / sgi.GetParentScaleY(); else this._y = y } } else { this._x = x; this._y = y } } OffsetXY(x, y) { x = +x; y = +y; if (this.GetTransformWithParentXOrY()) this.SetXY(this.GetX() + x, this.GetY() + y); else { this._x += x; this._y += y } } EqualsXY(x, y) { return this.GetX() === x && this.GetY() === y } SetZElevation(z) { z = +z; if (this.GetTransformWithParentZElevation()) z -= this.GetParent().GetZElevation(); if (this._zElevation === z) return; this._zElevation = z; this._UpdateZElevation(); const layer = this.GetLayer(); if (this._zElevation !== 0) layer._SetAnyInstanceZElevated(); layer.SetZIndicesChanged() } _UpdateZElevation() { this._UpdateRendererStateGroup(); if (this.HasChildren()) { const children = this.GetChildren(); for (let i = 0, len = children.length; i < len; i++) { const child = children[i]; if (child.GetTransformWithParentZElevation()) child._UpdateZElevation() } } } OffsetZElevation(z) { this.SetZElevation(this.GetZElevation() + z) } GetZElevation() { if (this.GetTransformWithParentZElevation()) return this.GetParent().GetZElevation() + this._zElevation; else return this._zElevation } GetTotalZElevation() { return this.GetLayer().GetZElevation() + this.GetZElevation() } SetWidth(w) { w = +w; if (this.GetTransformWithParentWidth()) this._w *= w / this.GetWidth(); else this._w = w } OffsetWidth(w) { w = +w; if (this.GetTransformWithParentWidth()) this.SetWidth(this.GetWidth() + w); else this._w += w } GetWidth() { if (this.GetTransformWithParentWidth()) return this.GetParent().GetWidth() * this._w; else return this._w } SetHeight(h) { h = +h; if (this.GetTransformWithParentHeight()) this._h *= h / this.GetHeight(); else this._h = h } OffsetHeight(h) { h = +h; if (this.GetTransformWithParentHeight()) this.SetHeight(this.GetHeight() + h); else this._h += h } GetHeight() { if (this.GetTransformWithParentHeight()) return this.GetParent().GetHeight() * this._h; else return this._h } SetSize(w, h) { w = +w; h = +h; if (this.GetTransformWithParentWidth()) this._w *= w / this.GetWidth(); else this._w = w; if (this.GetTransformWithParentHeight()) this._h *= h / this.GetHeight(); else this._h = h } GetSceneGraphScale() { if (this.HasParent()) { const sgi = this._sceneGraphInfo; return Math.min(sgi.GetParentScaleX(), sgi.GetParentScaleY()) } else return 1 } IsRotatable() { return (this._flags & FLAG_IS_ROTATABLE) !== 0 } SetAngle(a) { a = +a; if (!this.IsRotatable()) return; if (this.GetTransformWithParentAngle()) a -= this.GetParent().GetAngle(); a = C3.clampAngle(a); if (this._a === a) return; this._a = a; this._MarkSinCosAngleChanged() } OffsetAngle(a) { a = +a; if (a === 0 || !this.IsRotatable()) return; this._a = C3.clampAngle(this._a + a); this._MarkSinCosAngleChanged() } _MarkSinCosAngleChanged() { this._flags |= FLAG_SIN_COS_ANGLE_CHANGED; if (this.HasChildren()) { const children = this.GetChildren(); for (let i = 0, len = children.length; i < len; i++) children[i]._MarkSinCosAngleChanged() } } GetAngle() { if (this.GetTransformWithParentAngle()) return C3.clampAngle(this.GetParent().GetAngle() + this._a); else return this._a } _MaybeUpdateSinCosAngle() { const flags = this._flags; if ((flags & FLAG_SIN_COS_ANGLE_CHANGED) === 0) return; const a = this.GetAngle(); this._sinA = Math.sin(a); this._cosA = Math.cos(a); this._flags = flags & ~FLAG_SIN_COS_ANGLE_CHANGED } GetSinAngle() { this._MaybeUpdateSinCosAngle(); return this._sinA } GetCosAngle() { this._MaybeUpdateSinCosAngle(); return this._cosA } SetOriginX(x) { this._ox = +x } OffsetOriginX(x) { this._ox += +x } GetOriginX() { return this._ox } SetOriginY(y) { this._oy = +y } OffsetOriginY(y) { this._oy += +y } GetOriginY() { return this._oy } _SetColor(c) { if (this._color.equals(c)) return; if (this._color === DEFAULT_COLOR) { this._color = C3.New(C3.Color, c); this._colorPremultiplied = C3.New(C3.Color, c); this._colorPremultiplied.premultiply() } else if (c.equalsRgba(1, 1, 1, 1)) { this._color = DEFAULT_COLOR; this._colorPremultiplied = DEFAULT_COLOR } else { this._color.set(c); this._colorPremultiplied.set(c); this._colorPremultiplied.premultiply() } this._UpdateRendererStateGroup() } SetOpacity(o) { o = C3.clamp(+o, 0, 1); if (this._color.a === o) return; tempColor.copyRgb(this._color); tempColor.a = o; this._SetColor(tempColor) } OffsetOpacity(o) { this.SetOpacity(this.GetOpacity() + o) } GetOpacity() { return this._color.a } SetUnpremultipliedColor(c) { if (this._color.equalsIgnoringAlpha(c)) return; tempColor.copyRgb(c); tempColor.a = this._color.a; this._SetColor(tempColor) } SetUnpremultipliedColorRGB(r, g, b) { tempColor.setRgb(r, g, b); this.SetUnpremultipliedColor(tempColor) } OffsetUnpremultipliedColorRGB(r, g, b) { if (r === 0 && g === 0 && b === 0) return; tempColor.copyRgb(this._color); tempColor.r += r; tempColor.g += g; tempColor.b += b; this.SetUnpremultipliedColor(tempColor) } GetUnpremultipliedColor() { return this._color } GetPremultipliedColor() { return this._colorPremultiplied } GetDestroyWithParent() { return (this._flags & FLAG_DESTROY_WITH_PARENT) !== 0 } SetDestroyWithParent(d) { this._SetFlag(FLAG_DESTROY_WITH_PARENT, d) } GetTransformWithParentX() { return (this._flags & FLAG_TRANSFORM_WITH_PARENT_X) !== 0 } SetTransformWithParentX(tpx) { this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_X, tpx) } GetTransformWithParentY() { return (this._flags & FLAG_TRANSFORM_WITH_PARENT_Y) !== 0 } GetTransformWithParentXOrY() { return (this._flags & (FLAG_TRANSFORM_WITH_PARENT_X | FLAG_TRANSFORM_WITH_PARENT_Y)) !== 0 } SetTransformWithParentY(tpx) { this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_Y, tpx) } GetTransformWithParentWidth() { return (this._flags & FLAG_TRANSFORM_WITH_PARENT_W) !== 0 } SetTransformWithParentWidth(tpw) { this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_W, tpw) } GetTransformWithParentHeight() { return (this._flags & FLAG_TRANSFORM_WITH_PARENT_H) !== 0 } SetTransformWithParentHeight(tph) { this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_H, tph) } GetTransformWithParentAngle() { return (this._flags & FLAG_TRANSFORM_WITH_PARENT_A) !== 0 } SetTransformWithParentAngle(tpa) { this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_A, tpa) } GetTransformWithParentZElevation() { return (this._flags & FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION) !== 0 } SetTransformWithParentZElevation(tpz) { this._SetFlag(FLAG_TRANSFORM_WITH_PARENT_Z_ELEVATION, tpz) } _ClearAllSceneGraphFlags() { this._flags &= ~MASK_ALL_SCENE_GRAPH_FLAGS } AddChild(child, opts) { if (child === this) return; if (child.HasParent()) return; if (this._HasChildRecursive(child)) return; if (this._HasAnyParent(child)) return; const absX = child.GetX(); const absY = child.GetY(); const absW = child.GetWidth(); const absH = child.GetHeight(); const absA = child.GetAngle(); const absZElevation = child.GetZElevation(); child._SetParent(this); child.SetTransformWithParentX(opts.transformX); child.SetTransformWithParentY(opts.transformY); child.SetTransformWithParentWidth(opts.transformWidth); child.SetTransformWithParentHeight(opts.transformHeight); child.SetTransformWithParentAngle(opts.transformAngle); child.SetTransformWithParentZElevation(opts.transformZElevation); child.SetDestroyWithParent(opts.destroyWithParent); if (opts.transformX) child._x = absX - this.GetX(); if (opts.transformY) child._y = absY - this.GetY(); if (opts.transformWidth) child._w = absW / this.GetWidth(); if (opts.transformHeight) child._h = absH / this.GetHeight(); if (opts.transformAngle) child._a = absA - this.GetAngle(); if (opts.transformZElevation) child._zElevation = absZElevation - this.GetZElevation(); this._AddChildToSceneGraphInfo(child); this.SetBboxChanged() } RemoveChild(child) { if (child.GetParent() !== this) return; const absX = child.GetX(); const absY = child.GetY(); const absW = child.GetWidth(); const absH = child.GetHeight(); const absA = child.GetAngle(); const absZElevation = child.GetZElevation(); child._SetParent(null); child._ClearAllSceneGraphFlags(); child.SetXY(absX, absY); child.SetSize(absW, absH); child.SetAngle(absA); child.SetZElevation(absZElevation); this._RemoveChildFromSceneGraphInfo(child); this.SetBboxChanged() } _ResetAllSceneGraphState() { for (const c of this.children()) this.RemoveChild(c); const parent = this.GetParent(); if (parent) parent.RemoveChild(this); this._ClearAllSceneGraphFlags() } HasParent() { return this.GetParent() !== null } GetParent() { const sgi = this._sceneGraphInfo; return sgi !== null ? sgi.GetParent() : null } GetTopParent() { let p = this; while (p.HasParent()) p = p.GetParent(); return p } *parents() { let parent = this.GetParent(); while (parent) { yield parent; parent = parent.GetParent() } } HasChild(child) { return this.GetChildren().includes(child) } HasChildren() { const sgi = this._sceneGraphInfo; return sgi !== null ? sgi.HasChildren() : false } GetChildren() { const sgi = this._sceneGraphInfo; return sgi !== null ? sgi.GetChildren() : EMPTY_ARRAY } children() { return this.GetChildren() } *allChildren() { for (const child of this.children()) { yield child; yield*child.allChildren() } } GetChildCount() { return this.GetChildren().length } GetChildAt(index) { const children = this.GetChildren(); index = Math.floor(+index); if (index < 0 || index >= children.length) return null; return children[index] } _CreateSceneGraphInfo(parent) { if (!this._sceneGraphInfo) this._sceneGraphInfo = C3.New(C3.SceneGraphInfo, this); if (parent) this._sceneGraphInfo.SetParent(parent) } _GetSceneGraphInfo() { return this._sceneGraphInfo } _ReleaseSceneGraphInfo() { if (!this._sceneGraphInfo) return; this._sceneGraphInfo.Release(); this._sceneGraphInfo = null } _SetParent(parent) { if (parent) { parent._CreateSceneGraphInfo(null); this._CreateSceneGraphInfo(parent) } else { if (this._sceneGraphInfo) this._sceneGraphInfo.SetParent(null); if (!this.HasChildren()) this._ReleaseSceneGraphInfo() } } _HasAnyParent(child) { if (!this.HasParent()) return false; const parent = this.GetParent(); if (parent === child) return true; return parent._HasAnyParent(child) } _HasChildRecursive(child) { if (this.HasChild(child)) return true; for (const c of this.GetChildren()) if (c._HasChildRecursive(child)) return true; return false } _AddChildToSceneGraphInfo(child) { this._sceneGraphInfo.GetChildren().push(child) } _RemoveChildFromSceneGraphInfo(child) { const children = this._sceneGraphInfo.GetChildren(); const index = children.indexOf(child); if (index !== -1) children.splice(index, 1); if (children.length === 0 && !this.HasParent()) this._ReleaseSceneGraphInfo(); if (!child.HasChildren()) child._ReleaseSceneGraphInfo() } GetSceneGraphChildrenExportData() { return this._sceneGraphChildrenExportData } _UpdateRendererStateGroup() { if (!enableUpdateRendererStateGroup) return; const renderer = this._runtime.GetRenderer(); if (this._stateGroup) renderer.ReleaseStateGroup(this._stateGroup); this._stateGroup = renderer.AcquireStateGroup(renderer.GetTextureFillShaderProgram() || "", this.GetBlendMode(), this._colorPremultiplied, this.GetZElevation()) } GetRendererStateGroup() { return this._stateGroup } HasDefaultColor() { return this._color === DEFAULT_COLOR } SetBlendMode(bm) { bm = bm | 0; if (bm < 0 || bm > 31) throw new RangeError("invalid blend mode"); if (this.GetBlendMode() === bm) return; this._flags = this._flags & ~FLAG_BLEND_MODE_MASK | bm << FLAG_BLEND_MODE_BIT_OFFSET; this._UpdateRendererStateGroup() } GetBlendMode() { return (this._flags & FLAG_BLEND_MODE_MASK) >> FLAG_BLEND_MODE_BIT_OFFSET } _SetLayer(layer) { this._layer = layer; if (this.GetZElevation() !== 0) this._layer._SetAnyInstanceZElevated() } GetLayer() { return this._layer } GetLayout() { return this.GetLayer().GetLayout() } _SetZIndex(z) { this._zIndex = z | 0 } GetZIndex() { this._layer._UpdateZIndices(); return this._zIndex } _GetLastCachedZIndex() { return this._zIndex } _SetFlag(bit, enable) { if (enable) this._flags |= bit; else this._flags &= ~bit } IsVisible() { return (this._flags & FLAG_IS_VISIBLE) !== 0 } SetVisible(v) { this._SetFlag(FLAG_IS_VISIBLE, v) } IsCollisionEnabled() { return (this._flags & FLAG_COLLISION_ENABLED) !== 0 } SetCollisionEnabled(e) { e = !!e; if (this.IsCollisionEnabled() === e) return; this._SetFlag(FLAG_COLLISION_ENABLED, e); if (e) this.SetBboxChanged(); else this._RemoveFromCollisionCells() } SetSolidCollisionFilter(isInclusive, tags) { this._SetFlag(FLAG_SOLID_FILTER_INCLUSIVE, isInclusive); if (this._solidFilterTags) this._solidFilterTags.clear(); if (!tags.trim()) { this._solidFilterTags = null; return } if (!this._solidFilterTags) this._solidFilterTags = new Set; for (const tag of tags.split(" ")) if (tag) this._solidFilterTags.add(tag.toLowerCase()) } IsSolidCollisionAllowed(solidTagSet) { const isInclusive = (this._flags & FLAG_SOLID_FILTER_INCLUSIVE) !== 0; const filterTags = this._solidFilterTags; if (!solidTagSet || !filterTags) return !isInclusive; for (const tag of filterTags) if (solidTagSet.has(tag)) return isInclusive; return !isInclusive } SetBboxChanged() { this._flags |= FLAG_BBOX_CHANGED | FLAG_COLLISION_CELL_CHANGED | FLAG_MESH_CHANGED; this._objectClass._SetAnyCollisionCellChanged(true); this._runtime.UpdateRender(); if (this._layer.UsesRenderCells()) { this.CalculateBbox(this._boundingBox, this._boundingQuad, true); this._flags &= ~FLAG_BBOX_CHANGED; this._UpdateRenderCell() } if ((this._flags & FLAG_ENABLE_BBOX_CHANGED_EVENT) !== 0) this._inst.Dispatcher().dispatchEvent(bboxChangeEvent); if (this._sceneGraphInfo !== null) { const children = this._sceneGraphInfo.GetChildren(); for (let i = 0, len = children.length; i < len; ++i) children[i].SetBboxChanged() } } CalculateBbox(bbox, bquad, includeMesh) { const x = this.GetX(); const y = this.GetY(); const w = this.GetWidth(); const h = this.GetHeight(); const a = this.GetAngle(); bbox.setWH(x - this._ox * w, y - this._oy * h, w, h); if (includeMesh && this.HasMesh()) this._ExpandBboxForMesh(bbox); if (a === 0) bquad.setFromRect(bbox); else { bbox.offset(-x, -y); bquad.setFromRotatedRectPrecalc(bbox, this.GetSinAngle(), this.GetCosAngle()); bquad.offset(x, y); bquad.getBoundingBox(bbox) } bbox.normalize() } _UpdateBbox() { const flags = this._flags; if ((flags & FLAG_BBOX_CHANGED) !== 0) { this.CalculateBbox(this._boundingBox, this._boundingQuad, true); this._flags = flags & ~FLAG_BBOX_CHANGED } } GetBoundingBox() { this._UpdateBbox(); return this._boundingBox } GetBoundingQuad() { this._UpdateBbox(); return this._boundingQuad } PixelRoundQuad(quad) { const x = this.GetX(); const y = this.GetY(); const ox = Math.round(x) - x; const oy = Math.round(y) - y; if (ox === 0 && oy === 0) return quad; else { tempQuad.copy(quad); tempQuad.offset(ox, oy); return tempQuad } } OverwriteBoundingBox(box) { this._boundingBox.copy(box); this._boundingQuad.setFromRect(this._boundingBox); this._flags &= ~FLAG_BBOX_CHANGED; this._UpdateCollisionCell(); this._UpdateRenderCell() } SetBboxChangeEventEnabled(e) { this._SetFlag(FLAG_ENABLE_BBOX_CHANGED_EVENT, e) } IsBboxChangeEventEnabled() { return (this._flags & FLAG_ENABLE_BBOX_CHANGED_EVENT) !== 0 } IsInViewport(viewport) { return this.GetZElevation() === 0 ? viewport.intersectsRect(this.GetBoundingBox()) : this._IsInViewport_ZElevated() } _IsInViewport_ZElevated() { const layer = this.GetLayer(); const totalZElevation = this.GetTotalZElevation(); if (totalZElevation >= layer.GetCameraZ()) return false; layer.GetViewportForZ(totalZElevation, tempRect); return tempRect.intersectsRect(this.GetBoundingBox()) } SetSourceCollisionPoly(poly) { this._sourceCollisionPoly = poly; this._DiscardTransformedCollisionPoly(); if (this.HasMesh()) this._meshInfo.meshPoly = null } GetSourceCollisionPoly() { return this._sourceCollisionPoly } HasOwnCollisionPoly() { return this._sourceCollisionPoly !== null || this.HasMesh() } GetTransformedCollisionPoly() { return this._GetCustomTransformedCollisionPolyPrecalc(this.GetWidth(), this.GetHeight(), this.GetAngle(), this.GetSinAngle(), this.GetCosAngle()) } GetCustomTransformedCollisionPoly(w, h, a) { let sina = 0; let cosa = 1; if (a !== 0) { sina = Math.sin(a); cosa = Math.cos(a) } return this._GetCustomTransformedCollisionPolyPrecalc(w, h, a, sina, cosa) } _GetCustomTransformedCollisionPolyPrecalc(w, h, a, sinA, cosA) { let tpi = this._transformedPolyInfo; if (tpi === null) { tpi = { poly: C3.New(C3.CollisionPoly), width: NaN, height: NaN, angle: NaN }; this._transformedPolyInfo = tpi } const transformedPoly = tpi.poly; if (tpi.width === w && tpi.height === h && tpi.angle === a) return transformedPoly; const sourcePoly = this._sourceCollisionPoly; if (this.HasMesh()) { const ox = this.GetOriginX(); const oy = this.GetOriginY(); const sourceMesh = this.GetSourceMesh(); let meshPoly = this._meshInfo.meshPoly; if (!meshPoly) { if (sourcePoly) { tempCollisionPoly.copy(sourcePoly); tempCollisionPoly.offset(ox, oy) } else tempCollisionPoly.setDefaultPoints(); meshPoly = sourceMesh.InsertPolyMeshVertices(tempCollisionPoly); this._meshInfo.meshPoly = meshPoly } sourceMesh.TransformCollisionPoly(meshPoly, transformedPoly); transformedPoly.offset(-ox, -oy); transformedPoly.transformPrecalc(w, h, sinA, cosA) } else if (sourcePoly) { transformedPoly.copy(sourcePoly); transformedPoly.transformPrecalc(w, h, sinA, cosA) } else transformedPoly.setFromQuad(this.GetBoundingQuad(), -this.GetX(), -this.GetY()); tpi.width = w; tpi.height = h; tpi.angle = a; return transformedPoly } _DiscardTransformedCollisionPoly() { this.SetPhysicsBodyChanged(true); const tpi = this._transformedPolyInfo; if (tpi === null) return; tpi.width = NaN } CreateMesh(hsize, vsize) { hsize = Math.floor(hsize); vsize = Math.floor(vsize); if (!this.GetInstance().GetPlugin().SupportsMesh()) throw new Error("object does not support mesh"); this.ReleaseMesh(); this._meshInfo = { sourceMesh: C3.New(C3.Gfx.Mesh, hsize, vsize), transformedMesh: C3.New(C3.Gfx.Mesh, hsize, vsize), meshPoly: null } } HasMesh() { return this._meshInfo !== null } GetSourceMesh() { if (!this.HasMesh()) throw new Error("no mesh"); return this._meshInfo.sourceMesh } GetTransformedMesh() { if (!this.HasMesh()) throw new Error("no mesh"); return this._meshInfo.transformedMesh } SetMeshChanged(e) { this._SetFlag(FLAG_MESH_CHANGED, e) } IsMeshChanged() { return (this._flags & FLAG_MESH_CHANGED) !== 0 } SetPhysicsBodyChanged(e) { this._SetFlag(FLAG_PHYSICS_BODY_CHANGED, e) } IsPhysicsBodyChanged() { return (this._flags & FLAG_PHYSICS_BODY_CHANGED) !== 0 } _ExpandBboxForMesh(bbox) { const sourceMesh = this._meshInfo.sourceMesh; const minX = Math.min(sourceMesh.GetMinX(), 0); const minY = Math.min(sourceMesh.GetMinY(), 0); const maxX = Math.max(sourceMesh.GetMaxX(), 1); const maxY = Math.max(sourceMesh.GetMaxY(), 1); const w = bbox.width(); const h = bbox.height(); bbox.offsetLeft(minX * w); bbox.offsetTop(minY * h); bbox.offsetRight((maxX - 1) * w); bbox.offsetBottom((maxY - 1) * h) } ReleaseMesh() { if (!this._meshInfo) return; this._meshInfo.sourceMesh.Release(); this._meshInfo.transformedMesh.Release(); this._meshInfo = null; this._DiscardTransformedCollisionPoly() } SetMeshPoint(col, row, opts) { col = Math.floor(col); row = Math.floor(row); const mode = opts.mode || "absolute"; if (!VALID_SET_MESH_POINT_MODES.has(mode)) throw new Error("invalid mode"); const isRelative = mode === "relative"; let posx = opts.x; let posy = opts.y; let texu = typeof opts.u === "number" ? opts.u : isRelative ? 0 : -1; let texv = typeof opts.v === "number" ? opts.v : isRelative ? 0 : -1; if (!this.HasMesh()) return false; const sourceMesh = this.GetSourceMesh(); const p = sourceMesh.GetMeshPointAt(col, row); if (p === null) return false; if (isRelative) { posx += col / (sourceMesh.GetHSize() - 1); posy += row / (sourceMesh.GetVSize() - 1) } if (texu === -1 && !isRelative) texu = p.GetU(); else { if (isRelative) texu += col / (sourceMesh.GetHSize() - 1); texu = C3.clamp(texu, 0, 1) } if (texv === -1 && !isRelative) texv = p.GetV(); else { if (isRelative) texv += row / (sourceMesh.GetVSize() - 1); texv = C3.clamp(texv, 0, 1) } if (p.GetX() === posx && p.GetY() === posy && p.GetU() === texu && p.GetV() === texv) return false; p.SetX(posx); p.SetY(posy); p.SetU(texu); p.SetV(texv); this._DiscardTransformedCollisionPoly(); return true } HasTilemap() { return this._inst.HasTilemap() } ContainsPoint(x, y) { if (!this.GetBoundingBox().containsPoint(x, y)) return false; if (!this.GetBoundingQuad().containsPoint(x, y)) return false; if (this.HasTilemap()) return this._inst.GetSdkInstance().TestPointOverlapTile(x, y); if (!this.HasOwnCollisionPoly()) return true; return this.GetTransformedCollisionPoly().containsPoint(x - this.GetX(), y - this.GetY()) } _IsCollisionCellChanged() { return (this._flags & FLAG_COLLISION_CELL_CHANGED) !== 0 } _UpdateCollisionCell() { if (!this._IsCollisionCellChanged() || !this.IsCollisionEnabled()) return; const bbox = this.GetBoundingBox(); const grid = this._objectClass._GetCollisionCellGrid(); const collisionCells = this._collisionCells; tempRect.set(grid.XToCell(bbox.getLeft()), grid.YToCell(bbox.getTop()), grid.XToCell(bbox.getRight()), grid.YToCell(bbox.getBottom())); if (collisionCells.equals(tempRect)) return; const inst = this._inst; if (collisionCells === DEFAULT_COLLISION_CELLS) { grid.Update(inst, null, tempRect); this._collisionCells = C3.New(C3.Rect, tempRect) } else { grid.Update(inst, collisionCells, tempRect); collisionCells.copy(tempRect) } this._flags &= ~FLAG_COLLISION_CELL_CHANGED } _RemoveFromCollisionCells() { const collisionCells = this._collisionCells; if (collisionCells === DEFAULT_COLLISION_CELLS) return; this._objectClass._GetCollisionCellGrid().Update(this._inst, collisionCells, null); this._collisionCells = DEFAULT_COLLISION_CELLS } _UpdateRenderCell() { const layer = this.GetLayer(); if (!layer.UsesRenderCells()) return; const renderGrid = layer.GetRenderGrid(); const bbox = this.GetBoundingBox(); const renderCells = this._renderCells; tempRect.set(renderGrid.XToCell(bbox.getLeft()), renderGrid.YToCell(bbox.getTop()), renderGrid.XToCell(bbox.getRight()), renderGrid.YToCell(bbox.getBottom())); if (renderCells.equals(tempRect)) return; const inst = this._inst; if (renderCells === DEFAULT_RENDER_CELLS) { renderGrid.Update(inst, null, tempRect); this._renderCells = C3.New(C3.Rect, tempRect) } else { renderGrid.Update(inst, renderCells, tempRect); renderCells.copy(tempRect) } layer.SetRenderListStale() } _RemoveFromRenderCells() { const renderCells = this._renderCells; if (renderCells === DEFAULT_RENDER_CELLS) return; this.GetLayer().GetRenderGrid().Update(this._inst, renderCells, null); this._renderCells = DEFAULT_RENDER_CELLS } GetRenderCellRange() { return this._renderCells } ZOrderMoveToTop() { const inst = this._inst; const layer = this._layer; const layerInstances = layer._GetInstances(); if (layerInstances.length && layerInstances[layerInstances.length - 1] === inst) return; layer._RemoveInstance(inst, false); layer._AddInstance(inst, false); this._runtime.UpdateRender() } ZOrderMoveToBottom() { const inst = this._inst; const layer = this._layer; const layerInstances = layer._GetInstances(); if (layerInstances.length && layerInstances[0] === inst) return; layer._RemoveInstance(inst, false); layer._PrependInstance(inst, false); this._runtime.UpdateRender() } ZOrderMoveToLayer(layerMove) { const inst = this._inst; const curLayer = this._layer; if (curLayer.GetLayout() !== layerMove.GetLayout()) throw new Error("layer from different layout"); if (layerMove === curLayer) return; curLayer._RemoveInstance(inst, true); this._SetLayer(layerMove); layerMove._AddInstance(inst, true); this._runtime.UpdateRender() } ZOrderMoveAdjacentToInstance(otherInst, isAfter) { const inst = this._inst; const curLayer = this._layer; if (otherInst.GetUID() === inst.GetUID()) return; const otherWi = otherInst.GetWorldInfo(); if (!otherWi) throw new Error("expected world instance"); const otherLayer = otherWi.GetLayer(); let didChangeLayer = false; if (curLayer.GetIndex() !== otherLayer.GetIndex()) { curLayer._RemoveInstance(inst, true); this._SetLayer(otherLayer); otherLayer._AddInstance(inst, true); didChangeLayer = true } const didChangeZOrder = otherLayer.MoveInstanceAdjacent(inst, otherInst, !!isAfter); if (didChangeLayer || didChangeZOrder) this._runtime.UpdateRender() } GetInstanceEffectList() { return this._instanceEffectList } _SetHasAnyActiveEffect(e) { this._SetFlag(FLAG_HAS_ANY_ACTIVE_EFFECT, e) } HasAnyActiveEffect() { return (this._flags & FLAG_HAS_ANY_ACTIVE_EFFECT) !== 0 } _SaveToJson() { const o = { "x": this.GetX(), "y": this.GetY(), "w": this.GetWidth(), "h": this.GetHeight(), "l": this.GetLayer().GetSID(), "zi": this.GetZIndex() }; if (this.GetZElevation() !== 0) o["ze"] = this.GetZElevation(); if (this.GetAngle() !== 0) o["a"] = this.GetAngle(); if (!this.HasDefaultColor()) o["c"] = this._color.toJSON(); if (this.GetOriginX() !== .5) o["oX"] = this.GetOriginX(); if (this.GetOriginY() !== .5) o["oY"] = this.GetOriginY(); if (this.GetBlendMode() !== 0) o["bm"] = this.GetBlendMode(); if (!this.IsVisible()) o["v"] = this.IsVisible(); if (!this.IsCollisionEnabled()) o["ce"] = this.IsCollisionEnabled(); if (this.IsBboxChangeEventEnabled()) o["be"] = this.IsBboxChangeEventEnabled(); if (this._instanceEffectList) o["fx"] = this._instanceEffectList._SaveToJson(); const isSolidFilterInclusive = (this._flags & FLAG_SOLID_FILTER_INCLUSIVE) !== 0; if (isSolidFilterInclusive) o["sfi"] = isSolidFilterInclusive; if (this._solidFilterTags) o["sft"] = [...this._solidFilterTags].join(" "); if (this._sceneGraphInfo) o["sgi"] = this._sceneGraphInfo._SaveToJson(); return o } _LoadFromJson(o) { enableUpdateRendererStateGroup = false; this._ResetAllSceneGraphState(); this.SetX(o["x"]); this.SetY(o["y"]); this.SetWidth(o["w"]); this.SetHeight(o["h"]); this._SetZIndex(o["zi"]); this.SetZElevation(o.hasOwnProperty("ze") ? o["ze"] : 0); this.SetAngle(o.hasOwnProperty("a") ? o["a"] : 0); if (o.hasOwnProperty("c")) tempColor.setFromJSON(o["c"]); else if (o.hasOwnProperty("o")) { tempColor.copyRgb(this._color); tempColor.a = o["o"] } else tempColor.setRgba(1, 1, 1, 1); this._SetColor(tempColor); this.SetOriginX(o.hasOwnProperty("oX") ? o["oX"] : .5); this.SetOriginY(o.hasOwnProperty("oY") ? o["oY"] : .5); this.SetBlendMode(o.hasOwnProperty("bm") ? o["bm"] : 0); this.SetVisible(o.hasOwnProperty("v") ? o["v"] : true); this.SetCollisionEnabled(o.hasOwnProperty("ce") ? o["ce"] : true); this.SetBboxChangeEventEnabled(o.hasOwnProperty("be") ? o["be"] : false); this.SetSolidCollisionFilter(o.hasOwnProperty("sfi") ? o["sfi"] : false, o.hasOwnProperty("sft") ? o["sft"] : ""); if (this._instanceEffectList && o.hasOwnProperty("fx")) this._instanceEffectList._LoadFromJson(o["fx"]); if (o.hasOwnProperty("sgi")) { this._CreateSceneGraphInfo(null); const sgi = this._sceneGraphInfo; const sgiData = o["sgi"]; sgi._LoadFromJson(sgiData); const runtimeDispatcher = this.GetRuntime().Dispatcher(); const onAfterLoad = ()=>{ runtimeDispatcher.removeEventListener("afterload", onAfterLoad); sgi._OnAfterLoad(sgiData) } ; runtimeDispatcher.addEventListener("afterload", onAfterLoad) } this.SetBboxChanged(); enableUpdateRendererStateGroup = true; this._UpdateRendererStateGroup() } } } ;'use strict'; { const C3 = self.C3; C3.BehaviorType = class BehaviorType extends C3.DefendedBase { constructor(objectClass, data) { super(); const runtime = objectClass.GetRuntime(); const pluginManager = runtime.GetPluginManager(); const BehaviorCtor = runtime.GetObjectReference(data[1]); if (!pluginManager.HasBehaviorByConstructorFunction(BehaviorCtor)) pluginManager.CreateBehavior(data); this._runtime = runtime; this._objectClass = objectClass; this._behavior = pluginManager.GetBehaviorByConstructorFunction(BehaviorCtor); this._sdkType = null; this._instSdkCtor = BehaviorCtor.Instance; this._sid = data[2]; this._name = data[0]; this._jsPropName = this._runtime.GetJsPropName(data[3]); this._sdkType = C3.New(BehaviorCtor.Type, this); this.OnCreate() } static Create(objectClass, behaviorTypeData) { return C3.New(C3.BehaviorType, objectClass, behaviorTypeData) } Release() { this._runtime = null; this._behavior = null; this._sdkType.Release(); this._sdkType = null; this._instSdkCtor = null } GetSdkType() { return this._sdkType } OnCreate() { this._sdkType.OnCreate() } GetRuntime() { return this._runtime } GetObjectClass() { return this._objectClass } GetBehavior() { return this._behavior } GetInstanceSdkCtor() { return this._instSdkCtor } GetName() { return this._name } GetSID() { return this._sid } GetJsPropName() { return this._jsPropName } } } ;'use strict'; { const C3 = self.C3; const IBehaviorInstance = self.IBehaviorInstance; C3.BehaviorInstance = class BehaviorInstance extends C3.DefendedBase { constructor(opts) { super(); this._runtime = opts.runtime; this._behaviorType = opts.behaviorType; this._behavior = this._behaviorType.GetBehavior(); this._inst = opts.instance; this._index = opts.index; this._sdkInst = null; this._iScriptInterface = null; this._behavior._AddInstance(this._inst) } Release() { if (this._iScriptInterface) { this._iScriptInterface._Release(); this._iScriptInterface = null } this._behavior._RemoveInstance(this._inst); this._sdkInst.Release(); this._sdkInst = null; this._iScriptInterface = null; this._runtime = null; this._behaviorType = null; this._behavior = null; this._inst = null } _CreateSdkInstance(properties) { if (this._sdkInst) throw new Error("already got sdk instance"); this._sdkInst = C3.New(this._behaviorType.GetInstanceSdkCtor(), this, properties); this._InitScriptInterface() } GetSdkInstance() { return this._sdkInst } GetObjectInstance() { return this._inst } GetRuntime() { return this._runtime } GetBehaviorType() { return this._behaviorType } GetBehavior() { return this._behavior } _GetIndex() { return this._index } PostCreate() { this._sdkInst.PostCreate() } OnSpriteFrameChanged(prevFrame, nextFrame) { this._sdkInst.OnSpriteFrameChanged(prevFrame, nextFrame) } _GetDebuggerProperties() { return this._sdkInst.GetDebuggerProperties() } SaveToJson() { return this._sdkInst.SaveToJson() } LoadFromJson(o) { return this._sdkInst.LoadFromJson(o) } static SortByTickSequence(a, b) { const instA = a.GetObjectInstance(); const instB = b.GetObjectInstance(); const typeIndexA = instA.GetObjectClass().GetIndex(); const typeIndexB = instB.GetObjectClass().GetIndex(); if (typeIndexA !== typeIndexB) return typeIndexA - typeIndexB; const seqA = instA.GetPUID(); const seqB = instB.GetPUID(); if (seqA !== seqB) return seqA - seqB; return a.GetBehaviorInstance()._GetIndex() - b.GetBehaviorInstance()._GetIndex() } _InitScriptInterface() { const DefaultScriptClass = IBehaviorInstance; const SdkScriptClass = this._sdkInst.GetScriptInterfaceClass(); const ScriptInterfaceClass = SdkScriptClass || DefaultScriptClass; IBehaviorInstance._Init(this); this._iScriptInterface = new ScriptInterfaceClass; IBehaviorInstance._Init(null); if (SdkScriptClass && !(this._iScriptInterface instanceof DefaultScriptClass)) throw new TypeError(`script interface class '${SdkScriptClass.name}' does not extend the right base class '${DefaultScriptClass.name}'`); } GetScriptInterface() { return this._iScriptInterface } } } ;'use strict'; { const C3 = self.C3; C3.EffectList = class EffectList extends C3.DefendedBase { constructor(owner, data) { super(); this._owner = owner; this._allEffectTypes = []; this._activeEffectTypes = []; this._effectTypesByName = new Map; this._effectParams = []; this._preservesOpaqueness = true; for (const d of data) { const et = C3.New(C3.EffectType, this, d, this._allEffectTypes.length); this._allEffectTypes.push(et); this._effectTypesByName.set(et.GetName().toLowerCase(), et); if (d.length >= 3) this._effectParams.push(this._LoadSingleEffectParameters(d[2])) } this.GetRuntime()._AddEffectList(this) } Release() { C3.clearArray(this._allEffectTypes); C3.clearArray(this._activeEffectTypes); this._effectTypesByName.clear(); C3.clearArray(this._effectParams); this._owner = null } PrependEffectTypes(arr) { if (!arr.length) return; this._allEffectTypes = arr.concat(this._allEffectTypes); for (const et of arr) this._effectTypesByName.set(et.GetName().toLowerCase(), et); for (let i = 0, len = this._allEffectTypes.length; i < len; ++i) this._allEffectTypes[i]._SetIndex(i) } _LoadSingleEffectParameters(arr) { const ret = arr.slice(0); for (let i = 0, len = ret.length; i < len; ++i) { const p = ret[i]; if (Array.isArray(p)) { const c = C3.New(C3.Color); c.setFromJSON(p); ret[i] = c } } return ret } GetOwner() { return this._owner } GetRuntime() { return this._owner.GetRuntime() } UpdateActiveEffects() { C3.clearArray(this._activeEffectTypes); let preservesOpaqueness = true; for (const et of this._allEffectTypes) if (et.IsActive()) { this._activeEffectTypes.push(et); if (!et.GetShaderProgram().PreservesOpaqueness()) preservesOpaqueness = false } this._preservesOpaqueness = preservesOpaqueness } GetAllEffectTypes() { return this._allEffectTypes } HasAnyEffectType() { return this._allEffectTypes.length > 0 } GetEffectTypeByName(name) { return this._effectTypesByName.get(name.toLowerCase()) || null } GetEffectTypeByIndex(index) { index = Math.floor(+index); if (index < 0 || index >= this._allEffectTypes.length) throw new RangeError("invalid effect type index"); return this._allEffectTypes[index] } IsEffectIndexActive(index) { return this.GetEffectTypeByIndex(index).IsActive() } SetEffectIndexActive(index, a) { this.GetEffectTypeByIndex(index).SetActive(a) } GetActiveEffectTypes() { return this._activeEffectTypes } HasAnyActiveEffect() { return this._activeEffectTypes.length > 0 } PreservesOpaqueness() { return this._preservesOpaqueness } GetEffectParametersForIndex(index) { return this._effectParams[index] } static SaveFxParamToJson(param) { if (param && param instanceof C3.Color) return { "t": "color", "v": param.toJSON() }; else return param } static LoadFxParamFromJson(o) { if (typeof o === "object") { const type = o["t"]; if (type === "color") { const color = C3.New(C3.Color); color.setFromJSON(o["v"]); return color } else throw new Error("invalid effect parameter type"); } else return o } static SaveFxParamsToJson(params) { return params.map(C3.EffectList.SaveFxParamToJson) } static LoadFxParamsFromJson(arr) { return arr.map(C3.EffectList.LoadFxParamFromJson) } SaveToJson() { return this._allEffectTypes.map(et=>({ "name": et.GetName(), "active": et.IsActive(), "params": C3.EffectList.SaveFxParamsToJson(this._effectParams[et.GetIndex()]) })) } LoadFromJson(arr) { for (const o of arr) { const et = this.GetEffectTypeByName(o["name"]); if (!et) continue; et.SetActive(o["active"]); this._effectParams[et.GetIndex()] = C3.EffectList.LoadFxParamsFromJson(o["params"]) } this.UpdateActiveEffects() } } } ;'use strict'; { const C3 = self.C3; C3.EffectType = class EffectType extends C3.DefendedBase { constructor(effectList, data, index) { super(); this._effectList = effectList; this._id = data[0]; this._name = data[1]; this._index = index; this._shaderProgram = null; this._isActive = true } Release() { this._effectList = null; this._shaderProgram = null } Clone(effectListOwner) { const ret = C3.New(C3.EffectType, effectListOwner, [this._id, this._name], -1); ret._shaderProgram = this._shaderProgram; ret._isActive = this._isActive; return ret } _InitRenderer(renderer) { const shaderProgram = renderer.GetShaderProgramByName(this._id); if (!shaderProgram) throw new Error("failed to find shader program '" + this._id + "'"); this._shaderProgram = shaderProgram } GetEffectList() { return this._effectList } GetName() { return this._name } _SetIndex(i) { this._index = i } GetIndex() { return this._index } GetOwner() { return this._effectList.GetOwner() } GetRuntime() { return this._effectList.GetRuntime() } SetActive(a) { this._isActive = !!a } IsActive() { return this._isActive } GetShaderProgram() { return this._shaderProgram } GetDefaultParameterValues() { const ret = []; for (let i = 0, len = this._shaderProgram.GetParameterCount(); i < len; ++i) { const type = this._shaderProgram.GetParameterType(i); if (type === "float" || type === "percent") ret.push(0); else if (type === "color") ret.push(C3.New(C3.Color, 1, 1, 1, 1)); else throw new TypeError("unknown effect parameter type"); } return ret } } } ;'use strict'; { const C3 = self.C3; C3.InstanceEffectList = class InstanceEffectList extends C3.DefendedBase { constructor(inst, wi, data) { super(); this._inst = inst; this._wi = wi; this._effectList = inst.GetObjectClass().GetEffectList(); this._activeEffectFlags = []; this._activeEffectTypes = []; this._preservesOpaqueness = true; this._effectParams = []; for (const et of this._effectList.GetAllEffectTypes()) this._activeEffectFlags.push(true); this.UpdateActiveEffects() } Release() { C3.clearArray(this._activeEffectFlags); C3.clearArray(this._activeEffectTypes); C3.clearArray(this._effectParams); this._inst = null; this._effectList = null } _LoadEffectParameters(data) { for (const e of data) this._effectParams.push(this._LoadSingleEffectParameters(e)) } _LoadSingleEffectParameters(arr) { const ret = arr.slice(0); for (let i = 0, len = ret.length; i < len; ++i) { const p = ret[i]; if (Array.isArray(p)) { const c = C3.New(C3.Color); c.setFromJSON(p); ret[i] = c } } return ret } LoadDefaultEffectParameters() { for (const effectType of this._effectList.GetAllEffectTypes()) this._effectParams.push(effectType.GetDefaultParameterValues()) } GetOwner() { return this._owner } GetEffectList() { return this._effectList } GetRuntime() { return this._inst.GetRuntime() } UpdateActiveEffects() { C3.clearArray(this._activeEffectTypes); const allEffectTypes = this._effectList.GetAllEffectTypes(); const activeEffectTypes = this._activeEffectTypes; const activeEffectFlags = this._activeEffectFlags; let preservesOpaqueness = true; for (let i = 0, len = allEffectTypes.length; i < len; ++i) if (activeEffectFlags[i]) { const et = allEffectTypes[i]; activeEffectTypes.push(et); if (!et.GetShaderProgram().PreservesOpaqueness()) preservesOpaqueness = false } this._preservesOpaqueness = preservesOpaqueness; this._wi._SetHasAnyActiveEffect(!!activeEffectTypes.length) } GetActiveEffectTypes() { return this._activeEffectTypes } GetEffectParametersForIndex(index) { return this._effectParams[index] } PreservesOpaqueness() { return this._preservesOpaqueness } HasAnyActiveBackgroundBlendingEffect() { return this._activeEffectTypes.some(et=>et.GetShaderProgram().UsesDest()) } IsEffectIndexActive(i) { return this._activeEffectFlags[i] } SetEffectIndexActive(i, e) { this._activeEffectFlags[i] = !!e } GetAllEffectTypes() { return this._effectList.GetAllEffectTypes() } _SaveToJson() { return this._effectList.GetAllEffectTypes().map(et=>({ "name": et.GetName(), "active": this._activeEffectFlags[et.GetIndex()], "params": C3.EffectList.SaveFxParamsToJson(this._effectParams[et.GetIndex()]) })) } _LoadFromJson(arr) { for (const o of arr) { const et = this._effectList.GetEffectTypeByName(o["name"]); if (!et) continue; this._activeEffectFlags[et.GetIndex()] = o["active"]; this._effectParams[et.GetIndex()] = C3.EffectList.LoadFxParamsFromJson(o["params"]) } this.UpdateActiveEffects() } } } ;'use strict'; { const C3 = self.C3; const tempCandidates = []; const tileCollRectCandidates = []; const tempJumpthruRet = []; const tempPolyA = C3.New(C3.CollisionPoly); const tempPolyB = C3.New(C3.CollisionPoly); const tempQuad = C3.New(C3.Quad); const tempRect = C3.New(C3.Rect); const tempRect2 = C3.New(C3.Rect); C3.CollisionEngine = class CollisionEngine extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._registeredCollisions = []; this._collisionCheckCount = 0; this._collisionCheckSec = 0; this._polyCheckCount = 0; this._polyCheckSec = 0 } Release() { this._runtime = null } _Update1sStats() { this._collisionCheckSec = this._collisionCheckCount; this._collisionCheckCount = 0; this._polyCheckSec = this._polyCheckCount; this._polyCheckCount = 0 } Get1secCollisionChecks() { return this._collisionCheckSec } Get1secPolyChecks() { return this._polyCheckSec } RegisterCollision(a, b) { const aw = a.GetWorldInfo(); const bw = b.GetWorldInfo(); if (!aw || !bw) return; if (!aw.IsCollisionEnabled() || !bw.IsCollisionEnabled()) return; this._registeredCollisions.push([a, b]) } AddRegisteredCollisionCandidates(inst, otherType, arr) { for (const [a,b] of this._registeredCollisions) { let otherInst = null; if (inst === a) otherInst = b; else if (inst === b) otherInst = a; else continue; if (!otherInst.BelongsToObjectClass(otherType)) continue; if (!arr.includes(otherInst)) arr.push(otherInst) } } CheckRegisteredCollision(a, b) { if (!this._registeredCollisions.length) return false; for (const [c,d] of this._registeredCollisions) if (a === c && b === d || a === d && b === c) return true; return false } ClearRegisteredCollisions() { C3.clearArray(this._registeredCollisions) } TestOverlap(a, b) { if (!a || !b || a === b) return false; const aw = a.GetWorldInfo(); const bw = b.GetWorldInfo(); if (!aw.IsCollisionEnabled() || !bw.IsCollisionEnabled()) return false; this._collisionCheckCount++; const layerA = aw.GetLayer(); const layerB = bw.GetLayer(); const areLayerTransformsCompatible = layerA.IsTransformCompatibleWith(layerB); if (areLayerTransformsCompatible) return this._TestOverlap_SameLayers(aw, bw); else return this._TestOverlap_DifferentLayers(aw, bw) } _TestOverlap_SameLayers(aw, bw) { if (!aw.GetBoundingBox().intersectsRect(bw.GetBoundingBox())) return false; this._polyCheckCount++; if (!aw.GetBoundingQuad().intersectsQuad(bw.GetBoundingQuad())) return false; if (aw.HasTilemap() && bw.HasTilemap()) return false; if (aw.HasTilemap()) return this.TestTilemapOverlap(aw, bw); else if (bw.HasTilemap()) return this.TestTilemapOverlap(bw, aw); if (!aw.HasOwnCollisionPoly() && !bw.HasOwnCollisionPoly()) return true; const polyA = aw.GetTransformedCollisionPoly(); const polyB = bw.GetTransformedCollisionPoly(); return polyA.intersectsPoly(polyB, bw.GetX() - aw.GetX(), bw.GetY() - aw.GetY()) } _TestOverlap_DifferentLayers(aw, bw) { const layerA = aw.GetLayer(); const layerB = bw.GetLayer(); tempPolyA.copy(aw.GetTransformedCollisionPoly()); tempPolyB.copy(bw.GetTransformedCollisionPoly()); const ptsArrA = tempPolyA.pointsArr(); for (let i = 0, len = ptsArrA.length; i < len; i += 2) { const j = i + 1; const x = ptsArrA[i]; const y = ptsArrA[j]; const [lx,ly] = layerA.LayerToCanvasCss(x + aw.GetX(), y + aw.GetY()); ptsArrA[i] = lx; ptsArrA[j] = ly } const ptsArrB = tempPolyB.pointsArr(); for (let i = 0, len = ptsArrB.length; i < len; i += 2) { const j = i + 1; const x = ptsArrB[i]; const y = ptsArrB[j]; const [lx,ly] = layerB.LayerToCanvasCss(x + bw.GetX(), y + bw.GetY()); ptsArrB[i] = lx; ptsArrB[j] = ly } tempPolyA.setBboxChanged(); tempPolyB.setBboxChanged(); this._polyCheckCount++; return tempPolyA.intersectsPoly(tempPolyB, 0, 0) } TestTilemapOverlap(tmWi, wi) { const bbox = wi.GetBoundingBox(); const tmX = tmWi.GetX(); const tmY = tmWi.GetY(); const tmSdkInst = tmWi.GetInstance().GetSdkInstance(); const instX = wi.GetX(); const instY = wi.GetY(); const instHasPoly = wi.HasOwnCollisionPoly(); const instQuad = wi.GetBoundingQuad(); const collRects = tileCollRectCandidates; tmSdkInst.GetCollisionRectCandidates(bbox, collRects); for (let i = 0, len = collRects.length; i < len; ++i) { const c = collRects[i]; const rc = c.GetRect(); this._collisionCheckCount++; if (bbox.intersectsRectOffset(rc, tmX, tmY)) { tempQuad.setFromRect(rc); tempQuad.offset(tmX, tmY); if (tempQuad.intersectsQuad(instQuad)) if (instHasPoly) { const instPoly = wi.GetTransformedCollisionPoly(); const tilePoly = c.GetPoly(); if (tilePoly) { this._polyCheckCount++; if (tilePoly.intersectsPoly(instPoly, instX - (tmX + rc.getLeft()), instY - (tmY + rc.getTop()))) { C3.clearArray(collRects); return true } } else { tempPolyA.setFromQuad(tempQuad, 0, 0); if (tempPolyA.intersectsPoly(instPoly, instX, instY)) { C3.clearArray(collRects); return true } } } else { const tilePoly = c.GetPoly(); if (tilePoly) { tempPolyA.setFromQuad(instQuad, 0, 0); if (tilePoly.intersectsPoly(tempPolyA, -(tmX + rc.getLeft()), -(tmY + rc.getTop()))) { C3.clearArray(collRects); return true } } else { C3.clearArray(collRects); return true } } } } C3.clearArray(collRects); return false } TestAndSelectCanvasPointOverlap(objectClass, ptx, pty, isInverted) { const sol = objectClass.GetCurrentSol(); const currentEvent = this._runtime.GetCurrentEvent(); if (!currentEvent) throw new Error("cannot call outside event"); const isOrBlock = currentEvent.IsOrBlock(); if (sol.IsSelectAll()) { if (!isInverted) { sol._SetSelectAll(false); C3.clearArray(sol._GetOwnInstances()) } for (const inst of objectClass.GetInstances()) { const wi = inst.GetWorldInfo(); const layer = wi.GetLayer(); const [lx,ly] = layer.CanvasCssToLayer(ptx, pty, wi.GetTotalZElevation()); if (wi.ContainsPoint(lx, ly)) if (isInverted) return false; else sol._PushInstance(inst); else if (isOrBlock) sol._PushElseInstance(inst) } } else { const arr = isOrBlock ? sol._GetOwnElseInstances() : sol._GetOwnInstances(); let j = 0; for (let i = 0, len = arr.length; i < len; ++i) { const inst = arr[i]; const wi = inst.GetWorldInfo(); const layer = wi.GetLayer(); const [lx,ly] = layer.CanvasCssToLayer(ptx, pty, wi.GetTotalZElevation()); if (wi.ContainsPoint(lx, ly)) if (isInverted) return false; else if (isOrBlock) sol._PushInstance(inst); else arr[j++] = inst; else if (isOrBlock) arr[j++] = inst } if (!isInverted) arr.length = j } objectClass.ApplySolToContainer(); if (isInverted) return true; else return sol.HasAnyInstances() } GetCollisionCandidates(layer, rtype, bbox, candidates) { const isParallaxed = layer ? layer.GetParallaxX() !== 1 || layer.GetParallaxY() !== 1 : false; if (rtype.IsFamily()) for (const memberType of rtype.GetFamilyMembers()) if (isParallaxed || memberType.IsAnyInstanceParallaxed()) C3.appendArray(candidates, memberType.GetInstances()); else { memberType._UpdateAllCollisionCells(); memberType._GetCollisionCellGrid().QueryRange(bbox, candidates) } else if (isParallaxed || rtype.IsAnyInstanceParallaxed()) C3.appendArray(candidates, rtype.GetInstances()); else { rtype._UpdateAllCollisionCells(); rtype._GetCollisionCellGrid().QueryRange(bbox, candidates) } } GetObjectClassesCollisionCandidates(layer, objectClasses, bbox, candidates) { for (const objectClass of objectClasses) this.GetCollisionCandidates(layer, objectClass, bbox, candidates) } GetSolidCollisionCandidates(layer, bbox, candidates) { const solidBehavior = this._runtime.GetSolidBehavior(); if (!solidBehavior) return; this.GetObjectClassesCollisionCandidates(layer, solidBehavior.GetObjectClasses(), bbox, candidates) } GetJumpthruCollisionCandidates(layer, bbox, candidates) { const jumpthruBehavior = this._runtime.GetJumpthruBehavior(); if (!jumpthruBehavior) return; this.GetObjectClassesCollisionCandidates(layer, jumpthruBehavior.GetObjectClasses(), bbox, candidates) } IsSolidCollisionAllowed(solidInst, inst) { return solidInst._IsSolidEnabled() && (!inst || inst.GetWorldInfo().IsSolidCollisionAllowed(solidInst.GetSavedDataMap().get("solidTags"))) } TestOverlapSolid(inst) { const wi = inst.GetWorldInfo(); this.GetSolidCollisionCandidates(wi.GetLayer(), wi.GetBoundingBox(), tempCandidates); for (const s of tempCandidates) { if (!this.IsSolidCollisionAllowed(s, inst)) continue; if (this.TestOverlap(inst, s)) { C3.clearArray(tempCandidates); return s } } C3.clearArray(tempCandidates); return null } TestRectOverlapSolid(rect, inst) { this.GetSolidCollisionCandidates(null, rect, tempCandidates); for (const s of tempCandidates) { if (!this.IsSolidCollisionAllowed(s, inst)) continue; if (this.TestRectOverlap(rect, s)) { C3.clearArray(tempCandidates); return s } } C3.clearArray(tempCandidates); return null } TestOverlapJumpthru(inst, all) { let ret = null; if (all) { ret = tempJumpthruRet; C3.clearArray(ret) } const wi = inst.GetWorldInfo(); this.GetJumpthruCollisionCandidates(wi.GetLayer(), wi.GetBoundingBox(), tempCandidates); for (const j of tempCandidates) { if (!j._IsJumpthruEnabled()) continue; if (this.TestOverlap(inst, j)) if (all) ret.push(j); else { C3.clearArray(tempCandidates); return j } } C3.clearArray(tempCandidates); return ret } PushOut(inst, xdir, ydir, dist, otherInst) { dist = dist || 50; const wi = inst.GetWorldInfo(); const oldX = wi.GetX(); const oldY = wi.GetY(); for (let i = 0; i < dist; ++i) { wi.SetXY(oldX + xdir * i, oldY + ydir * i); wi.SetBboxChanged(); if (!this.TestOverlap(inst, otherInst)) return true } wi.SetXY(oldX, oldY); wi.SetBboxChanged(); return false } PushOutSolid(inst, xdir, ydir, dist, includeJumpthrus, specificJumpthru) { dist = dist || 50; const wi = inst.GetWorldInfo(); const oldX = wi.GetX(); const oldY = wi.GetY(); let lastOverlapped = null; let secondLastOverlapped = null; for (let i = 0; i < dist; ++i) { wi.SetXY(oldX + xdir * i, oldY + ydir * i); wi.SetBboxChanged(); if (!this.TestOverlap(inst, lastOverlapped)) { lastOverlapped = this.TestOverlapSolid(inst); if (lastOverlapped) secondLastOverlapped = lastOverlapped; else { if (includeJumpthrus) { if (specificJumpthru) lastOverlapped = this.TestOverlap(inst, specificJumpthru) ? specificJumpthru : null; else lastOverlapped = this.TestOverlapJumpthru(inst); if (lastOverlapped) secondLastOverlapped = lastOverlapped } if (!lastOverlapped) { if (secondLastOverlapped) this.PushInFractional(inst, xdir, ydir, secondLastOverlapped, 16, true); return true } } } } wi.SetXY(oldX, oldY); wi.SetBboxChanged(); return false } PushOutSolidAxis(inst, xdir, ydir, dist) { dist = dist || 50; const wi = inst.GetWorldInfo(); const oldX = wi.GetX(); const oldY = wi.GetY(); let lastOverlapped = null; let secondLastOverlapped = null; for (let i = 0; i < dist; ++i) for (let which = 0; which < 2; ++which) { const sign = which * 2 - 1; wi.SetXY(oldX + xdir * i * sign, oldY + ydir * i * sign); wi.SetBboxChanged(); if (!this.TestOverlap(inst, lastOverlapped)) { lastOverlapped = this.TestOverlapSolid(inst); if (lastOverlapped) secondLastOverlapped = lastOverlapped; else { if (secondLastOverlapped) this.PushInFractional(inst, xdir * sign, ydir * sign, secondLastOverlapped, 16, true); return true } } } wi.SetXY(oldX, oldY); wi.SetBboxChanged(); return false } PushInFractional(inst, xdir, ydir, otherInst, limit, includeAnySolid) { let divisor = 2; let forward = false; let overlapping = false; const wi = inst.GetWorldInfo(); let bestX = wi.GetX(); let bestY = wi.GetY(); while (divisor <= limit) { const frac = 1 / divisor; divisor *= 2; wi.OffsetXY(xdir * frac * (forward ? 1 : -1), ydir * frac * (forward ? 1 : -1)); wi.SetBboxChanged(); if (this.TestOverlap(inst, otherInst) || includeAnySolid && this.TestOverlapSolid(inst)) { forward = true; overlapping = true } else { forward = false; overlapping = false; bestX = wi.GetX(); bestY = wi.GetY() } } if (overlapping) { wi.SetXY(bestX, bestY); wi.SetBboxChanged() } } PushOutSolidNearest(inst, maxDist=100) { let dist = 0; const wi = inst.GetWorldInfo(); const oldX = wi.GetX(); const oldY = wi.GetY(); let dir = 0; let lastOverlapped = this.TestOverlapSolid(inst); if (!lastOverlapped) return true; while (dist <= maxDist) { let dx = 0; let dy = 0; switch (dir) { case 0: dx = 0; dy = -1; dist++; break; case 1: dx = 1; dy = -1; break; case 2: dx = 1; dy = 0; break; case 3: dx = 1; dy = 1; break; case 4: dx = 0; dy = 1; break; case 5: dx = -1; dy = 1; break; case 6: dx = -1; dy = 0; break; case 7: dx = -1; dy = -1; break } dir = (dir + 1) % 8; wi.SetXY(Math.floor(oldX + dx * dist), Math.floor(oldY + dy * dist)); wi.SetBboxChanged(); if (!this.TestOverlap(inst, lastOverlapped)) { lastOverlapped = this.TestOverlapSolid(inst); if (!lastOverlapped) return true } } wi.SetXY(oldX, oldY); wi.SetBboxChanged(); return false } CalculateBounceAngle(inst, startX, startY, otherInst) { const wi = inst.GetWorldInfo(); const oldX = wi.GetX(); const oldY = wi.GetY(); const radius = Math.max(10, C3.distanceTo(startX, startY, oldX, oldY)); const startAngle = C3.angleTo(startX, startY, oldX, oldY); const firstInst = otherInst || this.TestOverlapSolid(inst); if (!firstInst) return C3.clampAngle(startAngle + Math.PI); let curInst = firstInst; let anticlockwiseFreeAngle = 0; let clockwiseFreeAngle = 0; const increment = C3.toRadians(5); let i; for (i = 1; i < 36; ++i) { const curAngle = startAngle - i * increment; wi.SetXY(startX + Math.cos(curAngle) * radius, startY + Math.sin(curAngle) * radius); wi.SetBboxChanged(); if (!this.TestOverlap(inst, curInst)) { curInst = otherInst ? null : this.TestOverlapSolid(inst); if (!curInst) { anticlockwiseFreeAngle = curAngle; break } } } if (i === 36) anticlockwiseFreeAngle = C3.clampAngle(startAngle + Math.PI); curInst = firstInst; for (i = 1; i < 36; ++i) { const curAngle = startAngle + i * increment; wi.SetXY(startX + Math.cos(curAngle) * radius, startY + Math.sin(curAngle) * radius); wi.SetBboxChanged(); if (!this.TestOverlap(inst, curInst)) { curInst = otherInst ? null : this.TestOverlapSolid(inst); if (!curInst) { clockwiseFreeAngle = curAngle; break } } } if (i === 36) clockwiseFreeAngle = C3.clampAngle(startAngle + Math.PI); wi.SetXY(oldX, oldY); wi.SetBboxChanged(); if (clockwiseFreeAngle === anticlockwiseFreeAngle) return clockwiseFreeAngle; const halfDiff = C3.angleDiff(clockwiseFreeAngle, anticlockwiseFreeAngle) / 2; let normal; if (C3.angleClockwise(clockwiseFreeAngle, anticlockwiseFreeAngle)) normal = C3.clampAngle(anticlockwiseFreeAngle + halfDiff + Math.PI); else normal = C3.clampAngle(clockwiseFreeAngle + halfDiff); const vx = Math.cos(startAngle); const vy = Math.sin(startAngle); const nx = Math.cos(normal); const ny = Math.sin(normal); const v_dot_n = vx * nx + vy * ny; const rx = vx - 2 * v_dot_n * nx; const ry = vy - 2 * v_dot_n * ny; return C3.angleTo(0, 0, rx, ry) } TestSegmentOverlap(x1, y1, x2, y2, inst) { if (!inst) return false; const wi = inst.GetWorldInfo(); if (!wi.IsCollisionEnabled()) return false; this._collisionCheckCount++; tempRect.set(Math.min(x1, x2), Math.min(y1, y2), Math.max(x1, x2), Math.max(y1, y2)); if (!wi.GetBoundingBox().intersectsRect(tempRect)) return false; if (inst.HasTilemap()) return this._TestSegmentOverlapTilemap(x1, y1, x2, y2, inst, wi); this._polyCheckCount++; if (!wi.GetBoundingQuad().intersectsSegment(x1, y1, x2, y2)) return false; if (!wi.HasOwnCollisionPoly()) return true; const poly = wi.GetTransformedCollisionPoly(); return poly.intersectsSegment(wi.GetX(), wi.GetY(), x1, y1, x2, y2) } _TestSegmentOverlapTilemap(x1, y1, x2, y2, inst, wi) { const tmX = wi.GetX(); const tmY = wi.GetY(); const sdkInst = inst.GetSdkInstance(); const collRects = tileCollRectCandidates; tempRect2.set(x1, y1, x2, y2); tempRect2.normalize(); sdkInst.GetCollisionRectCandidates(tempRect2, collRects); for (let i = 0, len = collRects.length; i < len; ++i) { const c = collRects[i]; const tileRc = c.GetRect(); this._collisionCheckCount++; if (tempRect.intersectsRectOffset(tileRc, tmX, tmY)) { tempQuad.setFromRect(tileRc); tempQuad.offset(tmX, tmY); if (tempQuad.intersectsSegment(x1, y1, x2, y2)) { const tilePoly = c.GetPoly(); if (tilePoly) { this._polyCheckCount++; if (tilePoly.intersectsSegment(tmX + tileRc.getLeft(), tmY + tileRc.getTop(), x1, y1, x2, y2)) { C3.clearArray(collRects); return true } } else { C3.clearArray(collRects); return true } } } } C3.clearArray(collRects); return false } TestRectOverlap(rect, inst) { if (!inst) return false; const wi = inst.GetWorldInfo(); if (!wi.IsCollisionEnabled()) return false; this._collisionCheckCount++; if (!wi.GetBoundingBox().intersectsRect(rect)) return false; if (inst.HasTilemap()) return this._TestRectOverlapTilemap(rect, inst, wi); this._polyCheckCount++; tempQuad.setFromRect(rect); if (!wi.GetBoundingQuad().intersectsQuad(tempQuad)) return false; if (!wi.HasOwnCollisionPoly()) return true; const polyA = tempPolyA; polyA.setFromRect(rect, wi.GetX(), wi.GetY()); const polyB = wi.GetTransformedCollisionPoly(); return polyA.intersectsPoly(polyB, 0, 0) } _TestRectOverlapTilemap(rect, inst, wi) { const tmX = wi.GetX(); const tmY = wi.GetY(); const sdkInst = inst.GetSdkInstance(); const collRects = tileCollRectCandidates; sdkInst.GetCollisionRectCandidates(rect, collRects); for (let i = 0, len = collRects.length; i < len; ++i) { const c = collRects[i]; const tileRc = c.GetRect(); this._collisionCheckCount++; if (rect.intersectsRectOffset(tileRc, tmX, tmY)) { const tilePoly = c.GetPoly(); if (tilePoly) { this._polyCheckCount++; tempPolyA.setFromRect(rect, 0, 0); if (tilePoly.intersectsPoly(tempPolyA, -(tmX + tileRc.getLeft()), -(tmY + tileRc.getTop()))) { C3.clearArray(collRects); return true } } else { C3.clearArray(collRects); return true } } } C3.clearArray(collRects); return false } TestRayIntersectsInstance(inst, ray) { if (!inst) return; const wi = inst.GetWorldInfo(); if (!wi.IsCollisionEnabled()) return; this._collisionCheckCount++; if (!wi.GetBoundingBox().intersectsRect(ray.rect)) return; if (inst.HasTilemap()) { this._TestRayIntersectsTilemap(inst, wi, ray); return } this._polyCheckCount++; if (wi.HasOwnCollisionPoly()) ray.TestInstancePoly(inst, wi.GetX(), wi.GetY(), wi.GetTransformedCollisionPoly()); else ray.TestInstanceQuad(inst, wi.GetBoundingQuad()) } _TestRayIntersectsTilemap(inst, wi, ray) { const xOffset = wi.GetX(); const yOffset = wi.GetY(); const collRects = tileCollRectCandidates; inst.GetSdkInstance().GetCollisionRectCandidates(ray.rect, collRects); for (let i = 0, l = collRects.length; i < l; i++) { const c = collRects[i]; const tileRc = c.GetRect(); this._collisionCheckCount++; if (ray.rect.intersectsRectOffset(tileRc, xOffset, yOffset)) { const tilePoly = c.GetPoly(); this._polyCheckCount++; if (tilePoly) ray.TestInstancePoly(inst, xOffset + tileRc.getLeft(), yOffset + tileRc.getTop(), tilePoly); else ray.TestInstanceRect(inst, wi.GetX(), wi.GetY(), tileRc) } } C3.clearArray(collRects) } } } ;'use strict'; { const C3 = self.C3; C3.SparseGrid = class SparseGrid extends C3.DefendedBase { constructor(cellWidth, cellHeight) { super(); this._cellWidth = cellWidth; this._cellHeight = cellHeight; this._cells = C3.New(C3.PairMap) } Release() { this._cells.Release(); this._cells = null } GetCell(x, y, createIfMissing) { let ret = this._cells.Get(x, y); if (ret) return ret; else if (createIfMissing) { ret = C3.New(C3.GridCell, this, x, y); this._cells.Set(x, y, ret); return ret } else return null } XToCell(x) { const ret = Math.floor(x / this._cellWidth); return isFinite(ret) ? ret : 0 } YToCell(y) { const ret = Math.floor(y / this._cellHeight); return isFinite(ret) ? ret : 0 } Update(inst, oldRange, newRange) { if (oldRange) for (let x = oldRange.getLeft(), lenx = oldRange.getRight(); x <= lenx; ++x) for (let y = oldRange.getTop(), leny = oldRange.getBottom(); y <= leny; ++y) { if (newRange && newRange.containsPoint(x, y)) continue; const cell = this.GetCell(x, y, false); if (!cell) continue; cell.Remove(inst); if (cell.IsEmpty()) this._cells.Delete(x, y) } if (newRange) for (let x = newRange.getLeft(), lenx = newRange.getRight(); x <= lenx; ++x) for (let y = newRange.getTop(), leny = newRange.getBottom(); y <= leny; ++y) { if (oldRange && oldRange.containsPoint(x, y)) continue; this.GetCell(x, y, true).Insert(inst) } } QueryRange(rc, result) { let x = this.XToCell(rc.getLeft()); const ystart = this.YToCell(rc.getTop()); const lenx = this.XToCell(rc.getRight()); const leny = this.YToCell(rc.getBottom()); if (!isFinite(lenx) || !isFinite(leny)) return; for (; x <= lenx; ++x) for (let y = ystart; y <= leny; ++y) { const cell = this.GetCell(x, y, false); if (!cell) continue; cell.Dump(result) } } } } ;'use strict'; { const C3 = self.C3; C3.GridCell = class GridCell extends C3.DefendedBase { constructor(grid, x, y) { super(); this._grid = grid; this._x = x; this._y = y; this._instances = C3.New(C3.ArraySet) } Release() { this._instances.Release(); this._instances = null; this._grid = null } IsEmpty() { return this._instances.IsEmpty() } Insert(inst) { this._instances.Add(inst) } Remove(inst) { this._instances.Delete(inst) } Dump(result) { C3.appendArray(result, this._instances.GetArray()) } } } ;'use strict'; { const C3 = self.C3; const PADDING = 1E-6; const NO_HIT = 2; C3.Ray = class Ray { constructor() { this.x1 = 0; this.y1 = 0; this.x2 = 0; this.y2 = 0; this.dx = 0; this.dy = 0; this.rect = new C3.Rect; this.hitFraction = NO_HIT; this.hitUid = null; this.hitNormal = 0; this.hitNormalDx = 0; this.hitNormalDy = 0; this.hitX = 0; this.hitY = 0; this.distance = 0; this.normalX = 1; this.normalY = 0; this.reflectionX = 1; this.reflectionY = 0 } DidCollide() { return this.hitFraction < 1 + PADDING } Set(x1, y1, x2, y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.dx = x2 - x1; this.dy = y2 - y1; this.rect.set(x1, y1, x2, y2); this.rect.normalize(); this.hitFraction = NO_HIT; this.hitUid = null; this.hitNormal = 0; this.hitNormalDx = 0; this.hitNormalDy = 0; this.hitX = 0; this.hitY = 0; this.distance = 0; this.normalX = 1; this.normalY = 0; this.reflectionX = 1; this.reflectionY = 0; return this } Complete() { if (this.DidCollide() === false) return; const dx = this.dx * this.hitFraction; const dy = this.dy * this.hitFraction; const length = Math.sqrt(dx * dx + dy * dy); const dirx = dx / length; const diry = dy / length; this.distance = length - PADDING; this.hitX = this.x1 + dirx * this.distance; this.hitY = this.y1 + diry * this.distance; this.hitNormal = Math.atan2(this.hitNormalDy, this.hitNormalDx) + Math.PI / 2; this.normalX = Math.cos(this.hitNormal); this.normalY = Math.sin(this.hitNormal); const dot = dirx * this.normalX + diry * this.normalY; this.reflectionX = dirx - 2 * this.normalX * dot; this.reflectionY = diry - 2 * this.normalY * dot; if (dot > 0) { const PI = Math.PI; this.hitNormal = C3.clampAngle(this.hitNormal + PI); this.normalX = -this.normalX; this.normalY = -this.normalY } } TestInstanceSegment(inst, sx1, sy1, sx2, sy2) { const t = C3.rayIntersect(this.x1, this.y1, this.x2, this.y2, sx1, sy1, sx2, sy2); if (t >= 0 && t < this.hitFraction) { this.hitFraction = t; this.hitUid = inst.GetUID(); this.hitNormalDx = sx1 - sx2; this.hitNormalDy = sy1 - sy2 } } TestInstanceRect(inst, offX, offY, rect) { const lt = offX + rect.getLeft() , rt = offX + rect.getRight() , tp = offY + rect.getTop() , bm = offY + rect.getBottom(); this.TestInstanceSegment(inst, lt, tp, rt, tp); this.TestInstanceSegment(inst, rt, tp, rt, bm); this.TestInstanceSegment(inst, rt, bm, lt, bm); this.TestInstanceSegment(inst, lt, bm, lt, tp) } TestInstanceQuad(inst, quad) { const tlX = quad.getTlx() , tlY = quad.getTly() , trX = quad.getTrx() , trY = quad.getTry() , brX = quad.getBrx() , brY = quad.getBry() , blX = quad.getBlx() , blY = quad.getBly(); this.TestInstanceSegment(inst, tlX, tlY, trX, trY); this.TestInstanceSegment(inst, trX, trY, brX, brY); this.TestInstanceSegment(inst, brX, brY, blX, blY); this.TestInstanceSegment(inst, blX, blY, tlX, tlY) } TestInstancePoly(inst, offX, offY, poly) { const points = poly.pointsArr(); for (let i = 0, l = points.length; i < l; i += 2) { const ii = (i + 2) % l; const x1 = points[i] + offX; const y1 = points[i + 1] + offY; const x2 = points[ii] + offX; const y2 = points[ii + 1] + offY; this.TestInstanceSegment(inst, x1, y1, x2, y2) } } } } ;'use strict'; { const C3 = self.C3; const VALID_FULLSCREEN_MODES = new Set(["off", "crop", "scale-inner", "scale-outer", "letterbox-scale", "letterbox-integer-scale"]); const VALID_FULLSCREEN_SCALING_QUALITIES = new Set(["high", "low"]); const PERCENTTEXT_WIDTH = 300; const PERCENTTEXT_HEIGHT = 200; const PROGRESSBAR_WIDTH = 120; const PROGRESSBAR_HEIGHT = 8; const tempQuad = C3.New(C3.Quad); const tempRect = C3.New(C3.Rect); const SPLASH_MIN_DISPLAY_TIME = 3E3; const SPLASH_AFTER_FADEOUT_WAIT_TIME = 200; const SPLASH_FADE_DURATION = 300; C3.CanvasManager = class CanvasManager extends C3.DefendedBase { constructor(runtime) { super(); this._runtime = runtime; this._canvas = null; this._webglRenderer = null; this._gpuPreference = "high-performance"; this._windowInnerWidth = 0; this._windowInnerHeight = 0; this._canvasCssWidth = 0; this._canvasCssHeight = 0; this._canvasDeviceWidth = 0; this._canvasDeviceHeight = 0; this._canvasCssOffsetX = 0; this._canvasCssOffsetY = 0; this._enableMipmaps = true; this._drawWidth = 0; this._drawHeight = 0; this._fullscreenMode = "letterbox-scale"; this._documentFullscreenMode = "letterbox-scale"; this._deviceTransformOffX = 0; this._deviceTransformOffY = 0; this._wantFullscreenScalingQuality = "high"; this._fullscreenScalingQuality = this._wantFullscreenScalingQuality; this._isDocumentFullscreen = false; this._availableAdditionalRenderTargets = []; this._usedAdditionalRenderTargets = new Set; this._shaderData = null; this._gpuFrameTimingsBuffer = null; this._gpuTimeStartFrame = 0; this._gpuTimeEndFrame = 0; this._gpuCurUtilisation = NaN; this._gpuLastUtilisation = 0; this._layersGpuProfile = new Map; this._snapshotFormat = ""; this._snapshotQuality = 1; this._snapshotArea = C3.New(C3.Rect); this._snapshotUrl = ""; this._snapshotPromise = null; this._snapshotResolve = null; this._loaderStartTime = 0; this._rafId = -1; this._loadingProgress = 0; this._loadingprogress_handler = e=>this._loadingProgress = e.progress; this._percentText = null; this._loadingLogoAsset = null; this._splashTextures = { logo: null, powered: null, website: null }; this._splashFrameNumber = 0; this._splashFadeInFinishTime = 0; this._splashFadeOutStartTime = 0; this._splashState = "fade-in"; this._splashDoneResolve = null; this._splashDonePromise = new Promise(resolve=>this._splashDoneResolve = resolve) } _SetGPUPowerPreference(pref) { this._gpuPreference = pref } async CreateCanvas(opts) { this._canvas = opts["canvas"]; this._canvas.addEventListener("webglcontextlost", e=>this._OnWebGLContextLost(e)); this._canvas.addEventListener("webglcontextrestored", e=>this._OnWebGLContextRestored(e)); const rendererOpts = { powerPreference: this._gpuPreference, enableGpuProfiling: true }; if (C3.Platform.OS === "Android" && C3.Platform.BrowserEngine === "Chromium" && C3.Platform.BrowserVersionNumber < 75) { console.warn("[Construct 3] Disabling WebGL 2 because this device appears to be affected by crbug.com/934823. Install software updates to avoid this."); rendererOpts.maxWebGLVersion = 1 } if (this._runtime.GetCompositingMode() === "standard") rendererOpts.alpha = true; else { rendererOpts.alpha = false; rendererOpts.lowLatency = true } this._webglRenderer = C3.New(C3.Gfx.WebGLRenderer, this._canvas, rendererOpts); await this._webglRenderer.InitState(); if (!this._webglRenderer.SupportsGPUProfiling()) this._gpuLastUtilisation = NaN; this._runtime.AddDOMComponentMessageHandler("runtime", "window-resize", e=>this._OnWindowResize(e)); this._runtime.AddDOMComponentMessageHandler("runtime", "fullscreenchange", e=>this._OnFullscreenChange(e)); this._runtime.AddDOMComponentMessageHandler("runtime", "fullscreenerror", e=>this._OnFullscreenError(e)); this._isDocumentFullscreen = !!opts["isFullscreen"]; this.SetSize(opts["windowInnerWidth"], opts["windowInnerHeight"], true); this._shaderData = self["C3_Shaders"]; await this._LoadShaderPrograms(); let hasAnyBackgroundBlending = false; for (const effectList of this._runtime._GetAllEffectLists()) { for (const effectType of effectList.GetAllEffectTypes()) { effectType._InitRenderer(this._webglRenderer); if (effectType.GetShaderProgram().UsesDest()) hasAnyBackgroundBlending = true } effectList.UpdateActiveEffects() } this._runtime._SetUsesAnyBackgroundBlending(hasAnyBackgroundBlending); if (this._webglRenderer.SupportsGPUProfiling()) this._gpuFrameTimingsBuffer = C3.New(C3.Gfx.WebGLQueryResultBuffer, this._webglRenderer); this._webglRenderer.SetMipmapsEnabled(this._enableMipmaps) } async _LoadShaderPrograms() { if (!this._shaderData) return; const promises = []; for (const [id,data] of Object.entries(this._shaderData)) { const vertexSrc = C3.Gfx.WebGLShaderProgram.GetDefaultVertexShaderSource(this._webglRenderer.Is3D()); promises.push(this._webglRenderer.CreateShaderProgram(data, vertexSrc, id)) } await Promise.all(promises); this._webglRenderer.ResetLastProgram(); this._webglRenderer.SetTextureFillMode() } Release() { this._runtime = null; this._webglRenderer = null; this._canvas = null } _OnWindowResize(e) { const dpr = e["devicePixelRatio"]; if (this._runtime.IsInWorker()) self.devicePixelRatio = dpr; this._runtime._SetDevicePixelRatio(dpr); this.SetSize(e["innerWidth"], e["innerHeight"]); this._runtime.UpdateRender() } _OnFullscreenChange(e) { this._isDocumentFullscreen = !!e["isFullscreen"]; this.SetSize(e["innerWidth"], e["innerHeight"], true); this._runtime.UpdateRender() } _OnFullscreenError(e) { this._isDocumentFullscreen = !!e["isFullscreen"]; this.SetSize(e["innerWidth"], e["innerHeight"], true); this._runtime.UpdateRender() } SetSize(availableWidth, availableHeight, force=false) { availableWidth = Math.floor(availableWidth); availableHeight = Math.floor(availableHeight); if (availableWidth <= 0 || availableHeight <= 0) throw new Error("invalid size"); if (this._windowInnerWidth === availableWidth && this._windowInnerHeight === availableHeight && !force) return; this._windowInnerWidth = availableWidth; this._windowInnerHeight = availableHeight; const fullscreenMode = this.GetCurrentFullscreenMode(); if (fullscreenMode === "letterbox-scale") this._CalculateLetterboxScale(availableWidth, availableHeight); else if (fullscreenMode === "letterbox-integer-scale") this._CalculateLetterboxIntegerScale(availableWidth, availableHeight); else if (fullscreenMode === "off") this._CalculateFixedSizeCanvas(availableWidth, availableHeight); else this._CalculateFullsizeCanvas(availableWidth, availableHeight); this._UpdateFullscreenScalingQuality(fullscreenMode); this._canvas.width = this._canvasDeviceWidth; this._canvas.height = this._canvasDeviceHeight; this._runtime.PostComponentMessageToDOM("canvas", "update-size", { "marginLeft": this._canvasCssOffsetX, "marginTop": this._canvasCssOffsetY, "styleWidth": this._canvasCssWidth, "styleHeight": this._canvasCssHeight }); this._webglRenderer.SetSize(this._canvasDeviceWidth, this._canvasDeviceHeight, true) } _CalculateLetterboxScale(availableWidth, availableHeight) { const dpr = this._runtime.GetDevicePixelRatio(); const originalViewportWidth = this._runtime.GetOriginalViewportWidth(); const originalViewportHeight = this._runtime.GetOriginalViewportHeight(); const originalAspectRatio = originalViewportWidth / originalViewportHeight; const availableAspectRatio = availableWidth / availableHeight; if (availableAspectRatio > originalAspectRatio) { const letterboxedWidth = availableHeight * originalAspectRatio; this._canvasCssWidth = Math.round(letterboxedWidth); this._canvasCssHeight = availableHeight; this._canvasCssOffsetX = Math.floor((availableWidth - this._canvasCssWidth) / 2); this._canvasCssOffsetY = 0 } else { const letterboxedHeight = availableWidth / originalAspectRatio; this._canvasCssWidth = availableWidth; this._canvasCssHeight = Math.round(letterboxedHeight); this._canvasCssOffsetX = 0; this._canvasCssOffsetY = Math.floor((availableHeight - this._canvasCssHeight) / 2) } this._canvasDeviceWidth = Math.round(this._canvasCssWidth * dpr); this._canvasDeviceHeight = Math.round(this._canvasCssHeight * dpr); this._runtime.SetViewportSize(originalViewportWidth, originalViewportHeight) } _CalculateLetterboxIntegerScale(availableWidth, availableHeight) { const dpr = this._runtime.GetDevicePixelRatio(); if (dpr !== 1) { availableWidth += 1; availableHeight += 1 } const originalViewportWidth = this._runtime.GetOriginalViewportWidth(); const originalViewportHeight = this._runtime.GetOriginalViewportHeight(); const originalAspectRatio = originalViewportWidth / originalViewportHeight; const availableAspectRatio = availableWidth / availableHeight; let intScale; if (availableAspectRatio > originalAspectRatio) { const letterboxedWidth = availableHeight * originalAspectRatio; intScale = letterboxedWidth * dpr / originalViewportWidth } else { const letterboxedHeight = availableWidth / originalAspectRatio; intScale = letterboxedHeight * dpr / originalViewportHeight } if (intScale > 1) intScale = Math.floor(intScale); else if (intScale < 1) intScale = 1 / Math.ceil(1 / intScale); this._canvasDeviceWidth = Math.round(originalViewportWidth * intScale); this._canvasDeviceHeight = Math.round(originalViewportHeight * intScale); this._canvasCssWidth = this._canvasDeviceWidth / dpr; this._canvasCssHeight = this._canvasDeviceHeight / dpr; this._canvasCssOffsetX = Math.max(Math.floor((availableWidth - this._canvasCssWidth) / 2), 0); this._canvasCssOffsetY = Math.max(Math.floor((availableHeight - this._canvasCssHeight) / 2), 0); this._runtime.SetViewportSize(originalViewportWidth, originalViewportHeight) } _CalculateFullsizeCanvas(availableWidth, availableHeight) { const dpr = this._runtime.GetDevicePixelRatio(); this._canvasCssWidth = availableWidth; this._canvasCssHeight = availableHeight; this._canvasDeviceWidth = Math.round(this._canvasCssWidth * dpr); this._canvasDeviceHeight = Math.round(this._canvasCssHeight * dpr); this._canvasCssOffsetX = 0; this._canvasCssOffsetY = 0; const displayScale = this.GetDisplayScale(); this._runtime.SetViewportSize(this._canvasCssWidth / displayScale, this._canvasCssHeight / displayScale) } _CalculateFixedSizeCanvas(availableWidth, availableHeight) { const dpr = this._runtime.GetDevicePixelRatio(); this._canvasCssWidth = this._runtime.GetViewportWidth(); this._canvasCssHeight = this._runtime.GetViewportHeight(); this._canvasDeviceWidth = Math.round(this._canvasCssWidth * dpr); this._canvasDeviceHeight = Math.round(this._canvasCssHeight * dpr); if (this.IsDocumentFullscreen()) { this._canvasCssOffsetX = Math.floor((availableWidth - this._canvasCssWidth) / 2); this._canvasCssOffsetY = Math.floor((availableHeight - this._canvasCssHeight) / 2) } else { this._canvasCssOffsetX = 0; this._canvasCssOffsetY = 0 } this._runtime.SetViewportSize(this._runtime.GetViewportWidth(), this._runtime.GetViewportHeight()) } _UpdateFullscreenScalingQuality(fullscreenMode) { if (this._wantFullscreenScalingQuality === "high") { this._drawWidth = this._canvasDeviceWidth; this._drawHeight = this._canvasDeviceHeight; this._fullscreenScalingQuality = "high" } else { let viewportWidth, viewportHeight; if (this.GetCurrentFullscreenMode() === "off") { viewportWidth = this._runtime.GetViewportWidth(); viewportHeight = this._runtime.GetViewportHeight() } else { viewportWidth = this._runtime.GetOriginalViewportWidth(); viewportHeight = this._runtime.GetOriginalViewportHeight() } if (this._canvasDeviceWidth < viewportWidth && this._canvasDeviceHeight < viewportHeight) { this._drawWidth = this._canvasDeviceWidth; this._drawHeight = this._canvasDeviceHeight; this._fullscreenScalingQuality = "high" } else { this._drawWidth = viewportWidth; this._drawHeight = viewportHeight; this._fullscreenScalingQuality = "low"; if (fullscreenMode === "scale-inner") { const originalAspectRatio = viewportWidth / viewportHeight; const currentAspectRatio = this._windowInnerWidth / this._windowInnerHeight; if (currentAspectRatio < originalAspectRatio) this._drawWidth = this._drawHeight * currentAspectRatio; else if (currentAspectRatio > originalAspectRatio) this._drawHeight = this._drawWidth / currentAspectRatio } else if (fullscreenMode === "scale-outer") { const originalAspectRatio = viewportWidth / viewportHeight; const currentAspectRatio = this._windowInnerWidth / this._windowInnerHeight; if (currentAspectRatio > originalAspectRatio) this._drawWidth = this._drawHeight * currentAspectRatio; else if (currentAspectRatio < originalAspectRatio) this._drawHeight = this._drawWidth / currentAspectRatio } } } } IsDocumentFullscreen() { return this._isDocumentFullscreen } SetFullscreenMode(m) { if (!VALID_FULLSCREEN_MODES.has(m)) throw new Error("invalid fullscreen mode"); this._fullscreenMode = m } GetFullscreenMode() { return this._fullscreenMode } SetDocumentFullscreenMode(m) { if (!VALID_FULLSCREEN_MODES.has(m)) throw new Error("invalid fullscreen mode"); this._documentFullscreenMode = m } GetDocumentFullscreenMode() { return this._documentFullscreenMode } GetCurrentFullscreenMode() { if (this.IsDocumentFullscreen()) return this.GetDocumentFullscreenMode(); else return this.GetFullscreenMode() } SetFullscreenScalingQuality(q) { if (!VALID_FULLSCREEN_SCALING_QUALITIES.has(q)) throw new Error("invalid fullscreen scaling quality"); this._wantFullscreenScalingQuality = q } GetSetFullscreenScalingQuality() { return this._wantFullscreenScalingQuality } GetCurrentFullscreenScalingQuality() { return this._fullscreenScalingQuality } static _FullscreenModeNumberToString(n) { switch (n) { case 0: return "off"; case 1: return "crop"; case 2: return "scale-inner"; case 3: return "scale-outer"; case 4: return "letterbox-scale"; case 5: return "letterbox-integer-scale"; default: throw new Error("invalid fullscreen mode"); } } GetLastWidth() { return this._windowInnerWidth } GetLastHeight() { return this._windowInnerHeight } GetDrawWidth() { return this._drawWidth } GetDrawHeight() { return this._drawHeight } SetMipmapsEnabled(e) { this._enableMipmaps = !!e } IsWebGLContextLost() { return this._webglRenderer.IsContextLost() } _OnWebGLContextLost(e) { console.log("[Construct 3] WebGL context lost"); e.preventDefault(); this._availableAdditionalRenderTargets = []; this._usedAdditionalRenderTargets.clear(); this._webglRenderer.OnContextLost(); this._runtime._OnWebGLContextLost() } async _OnWebGLContextRestored(e) { await this._webglRenderer.OnContextRestored(); await this._LoadShaderPrograms(); for (const effectList of this._runtime._GetAllEffectLists()) for (const effectType of effectList.GetAllEffectTypes()) effectType._InitRenderer(this._webglRenderer); await this._runtime._OnWebGLContextRestored(); console.log("[Construct 3] WebGL context restored") } GetWebGLRenderer() { return this._webglRenderer } GetRenderScale() { if (this._fullscreenScalingQuality === "low") return 1 / this._runtime.GetDevicePixelRatio(); return this.GetDisplayScale() } GetDisplayScale() { const fullscreenMode = this.GetCurrentFullscreenMode(); if (fullscreenMode === "off" || fullscreenMode === "crop") return 1; const originalViewportWidth = this._runtime.GetOriginalViewportWidth(); const originalViewportHeight = this._runtime.GetOriginalViewportHeight(); const originalAspectRatio = originalViewportWidth / originalViewportHeight; const currentAspectRatio = this._canvasDeviceWidth / this._canvasDeviceHeight; if (fullscreenMode !== "scale-inner" && currentAspectRatio > originalAspectRatio || fullscreenMode === "scale-inner" && currentAspectRatio < originalAspectRatio) return this._canvasCssHeight / originalViewportHeight; else return this._canvasCssWidth / originalViewportWidth } SetDeviceTransformOffset(x, y) { this._deviceTransformOffX = x; this._deviceTransformOffY = y } SetDeviceTransform(renderer, w, h) { const scrollX = (w || this._drawWidth) / 2 + this._deviceTransformOffX; const scrollY = (h || this._drawHeight) / 2 + this._deviceTransformOffY; renderer.SetCameraXYZ(scrollX, scrollY, 100 * this._runtime.GetDevicePixelRatio()); renderer.SetLookXYZ(scrollX, scrollY, 0); renderer.ResetModelView(); renderer.UpdateModelView() } SetCssTransform(renderer) { const scrollX = this._canvasCssWidth / 2; const scrollY = this._canvasCssHeight / 2; renderer.SetCameraXYZ(scrollX, scrollY, 100); renderer.SetLookXYZ(scrollX, scrollY, 0); renderer.ResetModelView(); renderer.UpdateModelView() } GetDeviceWidth() { return this._canvasDeviceWidth } GetDeviceHeight() { return this._canvasDeviceHeight } GetCssWidth() { return this._canvasCssWidth } GetCssHeight() { return this._canvasCssHeight } GetCanvasClientX() { return this._canvasCssOffsetX } GetCanvasClientY() { return this._canvasCssOffsetY } GetAdditionalRenderTarget(opts) { const arr = this._availableAdditionalRenderTargets; const useIndex = arr.findIndex(rt=>rt.IsCompatibleWithOptions(opts)); let ret; if (useIndex !== -1) { ret = arr[useIndex]; arr.splice(useIndex, 1) } else ret = this._webglRenderer.CreateRenderTarget(opts); this._usedAdditionalRenderTargets.add(ret); return ret } ReleaseAdditionalRenderTarget(renderTarget) { if (!this._usedAdditionalRenderTargets.has(renderTarget)) throw new Error("render target not in use"); this._usedAdditionalRenderTargets.delete(renderTarget); this._availableAdditionalRenderTargets.push(renderTarget) } *activeLayersGpuProfiles() { for (const layout of this._runtime.GetLayoutManager().runningLayouts()) for (const layer of layout.GetLayers()) { const p = this._layersGpuProfile.get(layer); if (p) yield p } } GetLayerTimingsBuffer(layer) { if (!this._webglRenderer.SupportsGPUProfiling()) return null; let p = this._layersGpuProfile.get(layer); if (!p) { p = { name: layer.GetName(), timingsBuffer: C3.New(C3.Gfx.WebGLQueryResultBuffer, this._webglRenderer), curUtilisation: 0, lastUtilisation: 0 }; this._layersGpuProfile.set(layer, p) } return p.timingsBuffer } _Update1sFrameRange() { if (!this._webglRenderer.SupportsGPUProfiling()) return; if (this._gpuTimeEndFrame === 0) { this._gpuTimeEndFrame = this._webglRenderer.GetFrameNumber(); this._gpuCurUtilisation = NaN; for (const p of this.activeLayersGpuProfiles()) p.curUtilisation = NaN } } _UpdateTick() { if (!this._webglRenderer.SupportsGPUProfiling() || !isNaN(this._gpuCurUtilisation)) return; this._gpuCurUtilisation = this._gpuFrameTimingsBuffer.GetFrameRangeResultSum(this._gpuTimeStartFrame, this._gpuTimeEndFrame); if (isNaN(this._gpuCurUtilisation)) return; if (this._runtime.IsDebug()) for (const p of this.activeLayersGpuProfiles()) { p.curUtilisation = p.timingsBuffer.GetFrameRangeResultSum(this._gpuTimeStartFrame, this._gpuTimeEndFrame); if (isNaN(p.curUtilisation)) return } this._gpuFrameTimingsBuffer.DeleteAllBeforeFrameNumber(this._gpuTimeEndFrame); this._gpuLastUtilisation = Math.min(this._gpuCurUtilisation, 1); if (this._runtime.IsDebug()) { for (const p of this.activeLayersGpuProfiles()) { p.timingsBuffer.DeleteAllBeforeFrameNumber(this._gpuTimeEndFrame); p.lastUtilisation = Math.min(p.curUtilisation, 1) } self.C3Debugger.UpdateGPUProfile(this._gpuLastUtilisation, [...this.activeLayersGpuProfiles()]) } this._gpuTimeStartFrame = this._gpuTimeEndFrame; this._gpuTimeEndFrame = 0 } GetGPUFrameTimingsBuffer() { return this._gpuFrameTimingsBuffer } GetGPUUtilisation() { return this._gpuLastUtilisation } SnapshotCanvas(format, quality, x, y, width, height) { this._snapshotFormat = format; this._snapshotQuality = quality; this._snapshotArea.setWH(x, y, width, height); if (this._snapshotPromise) return this._snapshotPromise; this._snapshotPromise = new Promise(resolve=>{ this._snapshotResolve = resolve } ); return this._snapshotPromise } _MaybeTakeSnapshot() { if (!this._snapshotFormat) return; let canvas = this._canvas; const snapArea = this._snapshotArea; const x = C3.clamp(Math.floor(snapArea.getLeft()), 0, canvas.width); const y = C3.clamp(Math.floor(snapArea.getTop()), 0, canvas.height); let w = snapArea.width(); if (w === 0) w = canvas.width - x; else w = C3.clamp(Math.floor(w), 0, canvas.width - x); let h = snapArea.height(); if (h === 0) h = canvas.height - y; else h = C3.clamp(Math.floor(h), 0, canvas.height - y); if ((x !== 0 || y !== 0 || w !== canvas.width || h !== canvas.height) && (w > 0 && h > 0)) { canvas = C3.CreateCanvas(w, h); const ctx = canvas.getContext("2d"); ctx.drawImage(this._canvas, x, y, w, h, 0, 0, w, h) } C3.CanvasToBlob(canvas, this._snapshotFormat, this._snapshotQuality).then(blob=>{ this._snapshotUrl = URL.createObjectURL(blob); this._snapshotPromise = null; this._snapshotResolve(this._snapshotUrl) } ); this._snapshotFormat = ""; this._snapshotQuality = 1 } GetCanvasSnapshotUrl() { return this._snapshotUrl } InitLoadingScreen(loaderStyle) { if (loaderStyle === 2) { this._percentText = C3.New(C3.Gfx.RendererText, this._webglRenderer); this._percentText.SetIsAsync(false); this._percentText.SetFontName("Arial"); this._percentText.SetFontSize(16); this._percentText.SetHorizontalAlignment("center"); this._percentText.SetVerticalAlignment("center"); this._percentText.SetSize(PERCENTTEXT_WIDTH, PERCENTTEXT_HEIGHT) } else if (loaderStyle === 0) { const loadingLogoFilename = this._runtime.GetLoadingLogoFilename(); const assetManager = this._runtime.GetAssetManager(); let url; if (this._runtime.IsPreview()) { if (!assetManager._HasLocalUrlBlob(loadingLogoFilename)) return; url = assetManager.GetLocalUrlAsBlobUrl(loadingLogoFilename) } else url = assetManager.GetIconsSubfolder() + loadingLogoFilename; this._loadingLogoAsset = assetManager.LoadImage({ url }); this._loadingLogoAsset.LoadStaticTexture(this._webglRenderer).catch(err=>console.warn(`[C3 runtime] Failed to load '${loadingLogoFilename}' for loading screen. Check the project has an icon with that name.`, err)) } else if (loaderStyle === 4) { this._LoadSvgSplashImage("splash-images/splash-logo.svg").then(tex=>{ if (this._splashState === "done") this._webglRenderer.DeleteTexture(tex); else this._splashTextures.logo = tex } ).catch(err=>console.warn("Failed to load splash image: ", err)); this._LoadBitmapSplashImage("splash-images/splash-poweredby-512.png").then(tex=>{ if (this._splashState === "done") this._webglRenderer.DeleteTexture(tex); else this._splashTextures.powered = tex } ).catch(err=>console.warn("Failed to load splash image: ", err)); this._LoadBitmapSplashImage("splash-images/splash-website-512.png").then(tex=>{ if (this._splashState === "done") this._webglRenderer.DeleteTexture(tex); else this._splashTextures.website = tex } ).catch(err=>console.warn("Failed to load splash image: ", err)) } } async _LoadSvgSplashImage(url) { url = (new URL(url,this._runtime.GetBaseURL())).toString(); const blob = await C3.FetchBlob(url); const drawable = await this._runtime.RasterSvgImage(blob, 2048, 2048); return await this._webglRenderer.CreateStaticTextureAsync(drawable, { mipMapQuality: "high" }) } async _LoadBitmapSplashImage(url) { url = (new URL(url,this._runtime.GetBaseURL())).toString(); const blob = await C3.FetchBlob(url); return await this._webglRenderer.CreateStaticTextureAsync(blob, { mipMapQuality: "high" }) } HideCordovaSplashScreen() { this._runtime.PostComponentMessageToDOM("runtime", "hide-cordova-splash") } StartLoadingScreen() { this._loaderStartTime = Date.now(); this._runtime.Dispatcher().addEventListener("loadingprogress", this._loadingprogress_handler); this._rafId = requestAnimationFrame(()=>this._DrawLoadingScreen()); const loaderStyle = this._runtime.GetLoaderStyle(); if (loaderStyle !== 3) this.HideCordovaSplashScreen() } async EndLoadingScreen() { this._loadingProgress = 1; const loaderStyle = this._runtime.GetLoaderStyle(); if (loaderStyle === 4) await this._splashDonePromise; this._splashDoneResolve = null; this._splashDonePromise = null; if (this._rafId !== -1) { cancelAnimationFrame(this._rafId); this._rafId = -1 } this._runtime.Dispatcher().removeEventListener("loadingprogress", this._loadingprogress_handler); this._loadingprogress_handler = null; if (this._percentText) { this._percentText.Release(); this._percentText = null } if (this._loadingLogoAsset) { this._loadingLogoAsset.Release(); this._loadingLogoAsset = null } this._webglRenderer.Start(); if (this._splashTextures.logo) { this._webglRenderer.DeleteTexture(this._splashTextures.logo); this._splashTextures.logo = null } if (this._splashTextures.powered) { this._webglRenderer.DeleteTexture(this._splashTextures.powered); this._splashTextures.powered = null } if (this._splashTextures.website) { this._webglRenderer.DeleteTexture(this._splashTextures.website); this._splashTextures.website = null } this._webglRenderer.ClearRgba(0, 0, 0, 0); this._webglRenderer.Finish(); this._splashState = "done"; this._gpuTimeStartFrame = this._webglRenderer.GetFrameNumber(); if (loaderStyle === 3) this.HideCordovaSplashScreen() } _DrawLoadingScreen() { if (this._rafId === -1) return; const renderer = this._webglRenderer; renderer.Start(); this._rafId = -1; const hasHadError = this._runtime.GetAssetManager().HasHadErrorLoading(); const loaderStyle = this._runtime.GetLoaderStyle(); if (loaderStyle !== 3) { this.SetCssTransform(renderer); renderer.ClearRgba(0, 0, 0, 0); renderer.ResetColor(); renderer.SetTextureFillMode(); renderer.SetTexture(null) } if (loaderStyle === 0) this._DrawProgressBarAndLogoLoadingScreen(hasHadError); else if (loaderStyle === 1) this._DrawProgressBarLoadingScreen(hasHadError, PROGRESSBAR_WIDTH, 0); else if (loaderStyle === 2) this._DrawPercentTextLoadingScreen(hasHadError); else if (loaderStyle === 3) C3.noop(); else if (loaderStyle === 4) this._DrawSplashLoadingScreen(hasHadError); else throw new Error("invalid loader style"); renderer.Finish(); this._rafId = requestAnimationFrame(()=>this._DrawLoadingScreen()) } _DrawPercentTextLoadingScreen(hasHadError) { if (hasHadError) this._percentText.SetColorRgb(1, 0, 0); else this._percentText.SetColorRgb(.6, .6, .6); this._percentText.SetText(Math.round(this._loadingProgress * 100) + "%"); const midX = this._canvasCssWidth / 2; const midY = this._canvasCssHeight / 2; const hw = PERCENTTEXT_WIDTH / 2; const hh = PERCENTTEXT_HEIGHT / 2; tempQuad.setRect(midX - hw, midY - hh, midX + hw, midY + hh); this._webglRenderer.SetTexture(this._percentText.GetTexture()); this._webglRenderer.Quad3(tempQuad, this._percentText.GetTexRect()) } _DrawProgressBarLoadingScreen(hasHadError, width, yOff) { const renderer = this._webglRenderer; const height = PROGRESSBAR_HEIGHT; renderer.SetColorFillMode(); if (hasHadError) renderer.SetColorRgba(1, 0, 0, 1); else renderer.SetColorRgba(.118, .565, 1, 1); const midX = this._canvasCssWidth / 2; const midY = this._canvasCssHeight / 2; const hw = width / 2; const hh = height / 2; tempRect.setWH(midX - hw, midY - hh + yOff, Math.floor(width * this._loadingProgress), height); renderer.Rect(tempRect); tempRect.setWH(midX - hw, midY - hh + yOff, width, height); tempRect.offset(-.5, -.5); tempRect.inflate(.5, .5); renderer.SetColorRgba(0, 0, 0, 1); renderer.LineRect2(tempRect); tempRect.inflate(1, 1); renderer.SetColorRgba(1, 1, 1, 1); renderer.LineRect2(tempRect) } _DrawProgressBarAndLogoLoadingScreen(hasHadError) { if (!this._loadingLogoAsset) { this._DrawProgressBarLoadingScreen(hasHadError, PROGRESSBAR_WIDTH, 0); return } const logoTexture = this._loadingLogoAsset.GetTexture(); if (!logoTexture) { this._DrawProgressBarLoadingScreen(hasHadError, PROGRESSBAR_WIDTH, 0); return } const logoW = logoTexture.GetWidth(); const logoH = logoTexture.GetHeight(); const midX = this._canvasCssWidth / 2; const midY = this._canvasCssHeight / 2; const hw = logoW / 2; const hh = logoH / 2; tempQuad.setRect(midX - hw, midY - hh, midX + hw, midY + hh); this._webglRenderer.SetTexture(logoTexture); this._webglRenderer.Quad(tempQuad); this._DrawProgressBarLoadingScreen(hasHadError, logoW, hh + 16) } _DrawSplashLoadingScreen(hasHadError) { const renderer = this._webglRenderer; const logoTex = this._splashTextures.logo; const poweredTex = this._splashTextures.powered; const websiteTex = this._splashTextures.website; const nowTime = Date.now(); if (this._splashFrameNumber === 0) this._loaderStartTime = nowTime; const allowQuickSplash = this._runtime.IsPreview() || this._runtime.IsFBInstantAvailable() && !this._runtime.IsCordova(); const splashAfterFadeOutWait = allowQuickSplash ? 0 : SPLASH_AFTER_FADEOUT_WAIT_TIME; const splashMinDisplayTime = allowQuickSplash ? 0 : SPLASH_MIN_DISPLAY_TIME; let a = 1; if (this._splashState === "fade-in") a = Math.min((nowTime - this._loaderStartTime) / SPLASH_FADE_DURATION, 1); else if (this._splashState === "fade-out") a = Math.max(1 - (nowTime - this._splashFadeOutStartTime) / SPLASH_FADE_DURATION, 0); renderer.SetColorFillMode(); renderer.SetColorRgba(.231 * a, .251 * a, .271 * a, a); tempRect.set(0, 0, this._canvasCssWidth, this._canvasCssHeight); renderer.Rect(tempRect); const w = Math.ceil(this._canvasCssWidth); const h = Math.ceil(this._canvasCssHeight); let drawW, drawH; if (this._canvasCssHeight > 256) { renderer.SetColorRgba(.302 * a, .334 * a, .365 * a, a); drawW = w; drawH = Math.max(h * .005, 2); tempRect.setWH(0, h * .8 - drawH / 2, drawW, drawH); renderer.Rect(tempRect); if (hasHadError) renderer.SetColorRgba(a, 0, 0, a); else renderer.SetColorRgba(.161 * a, .953 * a, .816 * a, a); drawW = w * this._loadingProgress; tempRect.setWH(w * .5 - drawW / 2, h * .8 - drawH / 2, drawW, drawH); renderer.Rect(tempRect); renderer.SetColorRgba(a, a, a, a); renderer.SetTextureFillMode(); if (poweredTex) { drawW = C3.clamp(h * .22, 105, w * .6) * 1.5; drawH = drawW / 8; tempRect.setWH(w * .5 - drawW / 2, h * .2 - drawH / 2, drawW, drawH); renderer.SetTexture(poweredTex); renderer.Rect(tempRect) } if (logoTex) { drawW = Math.min(h * .395, w * .95); drawH = drawW; tempRect.setWH(w * .5 - drawW / 2, h * .485 - drawH / 2, drawW, drawH); renderer.SetTexture(logoTex); renderer.Rect(tempRect) } if (websiteTex) { drawW = C3.clamp(h * .22, 105, w * .6) * 1.5; drawH = drawW / 8; tempRect.setWH(w * .5 - drawW / 2, h * .868 - drawH / 2, drawW, drawH); renderer.SetTexture(websiteTex); renderer.Rect(tempRect) } } else { renderer.SetColorRgba(.302 * a, .334 * a, .365 * a, a); drawW = w; drawH = Math.max(h * .005, 2); tempRect.setWH(0, h * .85 - drawH / 2, drawW, drawH); renderer.Rect(tempRect); if (hasHadError) renderer.SetColorRgba(a, 0, 0, a); else renderer.SetColorRgba(.161 * a, .953 * a, .816 * a, a); drawW = w * this._loadingProgress; tempRect.setWH(w * .5 - drawW / 2, h * .85 - drawH / 2, drawW, drawH); renderer.Rect(tempRect); renderer.SetColorRgba(a, a, a, a); renderer.SetTextureFillMode(); if (logoTex) { drawW = h * .55; drawH = drawW; tempRect.setWH(w * .5 - drawW / 2, h * .45 - drawH / 2, drawW, drawH); renderer.SetTexture(logoTex); renderer.Rect(tempRect) } } this._splashFrameNumber++; if (this._splashState === "fade-in" && nowTime - this._loaderStartTime >= SPLASH_FADE_DURATION && this._splashFrameNumber >= 2) { this._splashState = "wait"; this._splashFadeInFinishTime = nowTime } if (this._splashState === "wait" && nowTime - this._splashFadeInFinishTime >= splashMinDisplayTime && this._loadingProgress >= 1) { this._splashState = "fade-out"; this._splashFadeOutStartTime = nowTime } if (this._splashState === "fade-out" && nowTime - this._splashFadeOutStartTime >= SPLASH_FADE_DURATION + splashAfterFadeOutWait || allowQuickSplash && this._loadingProgress >= 1 && nowTime - this._loaderStartTime < 500) this._splashDoneResolve() } } } ;'use strict'; { const C3 = self.C3; const C3Debugger = self.C3Debugger; const assert = self.assert; const DEFAULT_RUNTIME_OPTS = { "messagePort": null, "baseUrl": "", "headless": false, "hasDom": true, "isInWorker": false, "useAudio": true, "projectData": "", "exportType": "" }; let ife = true; C3.Runtime = class C3Runtime extends C3.DefendedBase { constructor(opts) { opts = Object.assign({}, DEFAULT_RUNTIME_OPTS, opts); super(); this._messagePort = opts["messagePort"]; this._baseUrl = opts["baseUrl"]; this._isHeadless = !!opts["headless"]; this._hasDom = !!opts["hasDom"]; this._isInWorker = !!opts["isInWorker"]; ife = opts["ife"]; this._useAudio = !!opts["useAudio"]; this._exportType = opts["exportType"]; this._isiOSCordova = !!opts["isiOSCordova"]; this._isiOSWebView = !!opts["isiOSWebView"]; this._isFBInstantAvailable = !!opts["isFBInstantAvailable"]; this._opusWasmScriptUrl = opts["opusWasmScriptUrl"]; this._opusWasmBinaryUrl = opts["opusWasmBinaryUrl"]; this._dataJsonFilename = "data.json"; this._isDebug = !!(this._exportType === "preview" && opts["isDebug"]); this._breakpointsEnabled = this._isDebug; this._isDebugging = this._isDebug; this._debuggingDisabled = 0; const localUrlBlobs = opts["previewImageBlobs"]; const projectFileBlobs = opts["previewProjectFileBlobs"]; if (projectFileBlobs) Object.assign(localUrlBlobs, projectFileBlobs); const projectData = opts["projectData"]; if (projectData) localUrlBlobs[this._dataJsonFilename] = projectData; this._additionalLoadPromises = []; this._additionalCreatePromises = []; this._isUsingCreatePromises = false; this._projectName = ""; this._projectVersion = ""; this._projectUniqueId = ""; this._appId = ""; this._originalViewportWidth = 0; this._originalViewportHeight = 0; this._devicePixelRatio = self.devicePixelRatio; this._parallaxXorigin = 0; this._parallaxYorigin = 0; this._viewportWidth = 0; this._viewportHeight = 0; this._loaderStyle = 0; this._usesLoaderLayout = false; this._isLoading = true; this._usesAnyBackgroundBlending = false; this._loadingLogoFilename = "loading-logo.png"; const isRemoteLoadPolicy = this._exportType === "html5" || this._exportType === "scirra-arcade" || this._exportType === "instant-games"; this._assetManager = C3.New(C3.AssetManager, this, { defaultLoadPolicy: isRemoteLoadPolicy ? "remote" : "local", localUrlBlobs, isCordova: this._exportType === "cordova", isiOSCordova: this._isiOSCordova, supportedAudioFormats: opts["supportedAudioFormats"] }); this._layoutManager = C3.New(C3.LayoutManager, this); this._eventSheetManager = C3.New(C3.EventSheetManager, this); this._pluginManager = C3.New(C3.PluginManager, this); this._collisionEngine = C3.New(C3.CollisionEngine, this); this._timelineManager = C3.New(C3.TimelineManager, this); this._transitionManager = C3.New(C3.TransitionManager, this); this._allObjectClasses = []; this._objectClassesByName = new Map; this._objectClassesBySid = new Map; this._familyCount = 0; this._allContainers = []; this._allEffectLists = []; this._currentLayoutStack = []; this._instancesPendingCreate = []; this._instancesPendingDestroy = new Map; this._hasPendingInstances = false; this._isFlushingPendingInstances = false; this._objectCount = 0; this._nextUid = 0; this._instancesByUid = new Map; this._instancesToReleaseAtEndOfTick = new Set; this._instancesToReleaseAffectedObjectClasses = new Set; this._objectReferenceTable = []; this._jsPropNameTable = []; this._canvasManager = null; this._framerateMode = "vsync"; this._compositingMode = "standard"; this._sampling = "trilinear"; this._isPixelRoundingEnabled = false; this._needRender = true; this._pauseOnBlur = false; this._isPausedOnBlur = false; this._tickCallbacks = { normal: timestamp=>{ this._rafId = -1; this._ruafId = -1; this.Tick(timestamp) } , tickOnly: timestamp=>{ this._ruafId = -1; this.Tick(timestamp, false, "skip-render") } , renderOnly: ()=>{ this._rafId = -1; this.Render() } }; this._rafId = -1; this._ruafId = -1; this._tickCount = 0; this._tickCountNoSave = 0; this._execCount = 0; this._hasStarted = false; this._isInTick = false; this._hasStartedTicking = false; this._isLayoutFirstTick = true; this._suspendCount = 0; this._scheduleTriggersThrottle = new C3.PromiseThrottle(1); this._randomNumberCallback = ()=>Math.random(); this._startTime = 0; this._lastTickTime = 0; this._dt1 = 0; this._dt = 0; this._timeScale = 1; this._minimumFramerate = 30; this._gameTime = C3.New(C3.KahanSum); this._wallTime = C3.New(C3.KahanSum); this._fpsFrameCount = -1; this._fpsLastTime = 0; this._fps = 0; this._mainThreadTimeCounter = 0; this._mainThreadTime = 0; this._isLoadingState = false; this._saveToSlotName = ""; this._loadFromSlotName = ""; this._loadFromJson = null; this._lastSaveJson = ""; this._triggerOnCreateAfterLoad = []; this._projectStorage = null; this._savegamesStorage = null; this._dispatcher = C3.New(C3.Event.Dispatcher); this._domEventHandlers = new Map; this._pendingResponsePromises = new Map; this._nextDomResponseId = 0; this._didRequestDeviceOrientationEvent = false; this._didRequestDeviceMotionEvent = false; this._isReadyToHandleEvents = false; this._waitingToHandleEvents = []; this._eventObjects = { "pretick": C3.New(C3.Event, "pretick", false), "tick": C3.New(C3.Event, "tick", false), "tick2": C3.New(C3.Event, "tick2", false), "instancedestroy": C3.New(C3.Event, "instancedestroy", false), "beforelayoutchange": C3.New(C3.Event, "beforelayoutchange", false), "layoutchange": C3.New(C3.Event, "layoutchange", false) }; this._eventObjects["instancedestroy"].instance = null; this._userScriptDispatcher = C3.New(C3.Event.Dispatcher); this._userScriptEventObjects = null; this._behInstsToTick = C3.New(C3.RedBlackSet, C3.BehaviorInstance.SortByTickSequence); this._behInstsToPostTick = C3.New(C3.RedBlackSet, C3.BehaviorInstance.SortByTickSequence); this._behInstsToTick2 = C3.New(C3.RedBlackSet, C3.BehaviorInstance.SortByTickSequence); this._jobScheduler = C3.New(C3.JobSchedulerRuntime, this, opts["jobScheduler"]); if (opts["canvas"]) this._canvasManager = C3.New(C3.CanvasManager, this); this._messagePort.onmessage = e=>this["_OnMessageFromDOM"](e.data); this.AddDOMComponentMessageHandler("runtime", "visibilitychange", e=>this._OnVisibilityChange(e)); this.AddDOMComponentMessageHandler("runtime", "opus-decode", e=>this._WasmDecodeWebMOpus(e["arrayBuffer"])); this.AddDOMComponentMessageHandler("runtime", "get-remote-preview-status-info", ()=>this._GetRemotePreviewStatusInfo()); this.AddDOMComponentMessageHandler("runtime", "js-invoke-function", e=>this._InvokeFunctionFromJS(e)); this.AddDOMComponentMessageHandler("runtime", "go-to-last-error-script", self["goToLastErrorScript"]); this._dispatcher.addEventListener("window-blur", e=>this._OnWindowBlur(e)); this._dispatcher.addEventListener("window-focus", ()=>this._OnWindowFocus()); this._timelineManager.AddRuntimeListeners(); this._iRuntime = null; this._interfaceMap = new WeakMap; this._commonScriptInterfaces = { keyboard: null, mouse: null, touch: null } } static Create(opts) { return C3.New(C3.Runtime, opts) } Release() { C3.clearArray(this._allObjectClasses); this._objectClassesByName.clear(); this._objectClassesBySid.clear(); this._layoutManager.Release(); this._layoutManager = null; this._eventSheetManager.Release(); this._eventSheetManager = null; this._pluginManager.Release(); this._pluginManager = null; this._assetManager.Release(); this._assetManager = null; this._collisionEngine.Release(); this._collisionEngine = null; this._timelineManager.Release(); this._timelineManager = null; this._transitionManager.Release(); this._transitionManager = null; if (this._canvasManager) { this._canvasManager.Release(); this._canvasManager = null } this._dispatcher.Release(); this._dispatcher = null; this._tickEvent = null } ["_OnMessageFromDOM"](data) { const type = data["type"]; if (type === "event") this._OnEventFromDOM(data); else if (type === "result") this._OnResultFromDOM(data); else throw new Error(`unknown message '${type}'`); } _OnEventFromDOM(e) { if (!this._isReadyToHandleEvents) { this._waitingToHandleEvents.push(e); return } const component = e["component"]; const handler = e["handler"]; const data = e["data"]; const dispatchOpts = e["dispatchOpts"]; const dispatchRuntimeEvent = !!(dispatchOpts && dispatchOpts["dispatchRuntimeEvent"]); const dispatchUserScriptEvent = !!(dispatchOpts && dispatchOpts["dispatchUserScriptEvent"]); const responseId = e["responseId"]; if (component === "runtime") { if (dispatchRuntimeEvent) { const event = new C3.Event(handler); event.data = data; this._dispatcher.dispatchEventAndWaitAsyncSequential(event) } if (dispatchUserScriptEvent) { const event = new C3.Event(handler,true); for (const [key,value] of Object.entries(data)) event[key] = value; this.DispatchUserScriptEvent(event) } } const handlerMap = this._domEventHandlers.get(component); if (!handlerMap) { if (!dispatchRuntimeEvent && !dispatchUserScriptEvent) console.warn(`[Runtime] No DOM event handlers for component '${component}'`); return } const func = handlerMap.get(handler); if (!func) { if (!dispatchRuntimeEvent && !dispatchUserScriptEvent) console.warn(`[Runtime] No DOM handler '${handler}' for component '${component}'`); return } let ret = null; try { ret = func(data) } catch (err) { console.error(`Exception in '${component}' handler '${handler}':`, err); if (responseId !== null) this._PostResultToDOM(responseId, false, "" + err); return } if (responseId !== null) if (ret && ret.then) ret.then(result=>this._PostResultToDOM(responseId, true, result)).catch(err=>{ console.error(`Rejection from '${component}' handler '${handler}':`, err); this._PostResultToDOM(responseId, false, "" + err) } ); else this._PostResultToDOM(responseId, true, ret) } _PostResultToDOM(responseId, isOk, result) { this._messagePort.postMessage({ "type": "result", "responseId": responseId, "isOk": isOk, "result": result }) } _OnResultFromDOM(data) { const responseId = data["responseId"]; const isOk = data["isOk"]; const result = data["result"]; const pendingPromise = this._pendingResponsePromises.get(responseId); if (isOk) pendingPromise.resolve(result); else pendingPromise.reject(result); this._pendingResponsePromises.delete(responseId) } AddDOMComponentMessageHandler(component, handler, func) { let handlerMap = this._domEventHandlers.get(component); if (!handlerMap) { handlerMap = new Map; this._domEventHandlers.set(component, handlerMap) } if (handlerMap.has(handler)) throw new Error(`[Runtime] Component '${component}' already has handler '${handler}'`); handlerMap.set(handler, func) } PostComponentMessageToDOM(component, handler, data) { this._messagePort.postMessage({ "type": "event", "component": component, "handler": handler, "data": data, "responseId": null }) } PostComponentMessageToDOMAsync(component, handler, data) { const responseId = this._nextDomResponseId++; const ret = new Promise((resolve,reject)=>{ this._pendingResponsePromises.set(responseId, { resolve, reject }) } ); this._messagePort.postMessage({ "type": "event", "component": component, "handler": handler, "data": data, "responseId": responseId }); return ret } PostToDebugger(data) { if (!this.IsDebug()) throw new Error("not in debug mode"); this.PostComponentMessageToDOM("runtime", "post-to-debugger", data) } async Init(opts) { if (this.IsDebug()) await C3Debugger.Init(this); else if (self.C3Debugger) self.C3Debugger.InitPreview(this); const [o] = await Promise.all([this._assetManager.FetchJson(this._dataJsonFilename), this._MaybeLoadOpusDecoder(), this._jobScheduler.Init()]); this._LoadDataJson(o); await this._InitialiseCanvas(opts); if (!this.IsPreview()) console.info("Made with Construct 3, the game and app creator :: https://www.construct.net"); const webglRenderer = this.GetWebGLRenderer(); if (webglRenderer) { console.info(`[C3 runtime] Hosted in ${this.IsInWorker() ? "worker" : "DOM"}, rendering with WebGL ${webglRenderer.GetWebGLVersionNumber()} [${webglRenderer.GetUnmaskedRenderer()}] (${webglRenderer.IsDesynchronized() ? "desynchronized" : "standard"} compositing)`); if (webglRenderer.HasMajorPerformanceCaveat()) console.warn("[C3 runtime] WebGL indicates a major performance caveat. Software rendering may be in use. This can result in significantly degraded performance.") } else console.info(`[C3 runtime] Hosted in ${this.IsInWorker() ? "worker" : "DOM"}, headless`); this._isReadyToHandleEvents = true; for (const e of this._waitingToHandleEvents) this._OnEventFromDOM(e); C3.clearArray(this._waitingToHandleEvents); if (this._canvasManager) this._canvasManager.StartLoadingScreen(); for (const f of opts["runOnStartupFunctions"]) this._additionalLoadPromises.push(this._RunOnStartupFunction(f)); await Promise.all([this._assetManager.WaitForAllToLoad(), ...this._additionalLoadPromises]); C3.clearArray(this._additionalLoadPromises); if (this._assetManager.HasHadErrorLoading()) { if (this._canvasManager) this._canvasManager.HideCordovaSplashScreen(); return } if (this._canvasManager) await this._canvasManager.EndLoadingScreen(); await this._dispatcher.dispatchEventAndWaitAsync(new C3.Event("beforeruntimestart")); await this.Start(); this._messagePort.postMessage({ "type": "runtime-ready" }); return this } async _RunOnStartupFunction(f) { try { await f(this._iRuntime) } catch (err) { console.error("[C3 runtime] Error in runOnStartup function: ", err) } } _LoadDataJson(o) { const projectData = o["project"]; this._projectName = projectData[0]; this._projectVersion = projectData[16]; this._projectUniqueId = projectData[31]; this._appId = projectData[38]; this._loadingLogoFilename = projectData[39]; this._isPixelRoundingEnabled = !!projectData[9]; this._originalViewportWidth = this._viewportWidth = projectData[10]; this._originalViewportHeight = this._viewportHeight = projectData[11]; this._parallaxXorigin = this._originalViewportWidth / 2; this._parallaxYorigin = this._originalViewportHeight / 2; this._compositingMode = projectData[36]; this._framerateMode = projectData[37]; if (this._compositingMode === "low-latency" && this.IsAndroidWebView() && C3.Platform.BrowserVersionNumber <= 77) { console.warn("[C3 runtime] Desynchronized (low-latency) compositing is enabled, but is disabled in the Android WebView <=77 due to crbug.com/1008842. Reverting to synchronized (standard) compositing."); this._compositingMode = "standard" } this._sampling = projectData[14]; this._usesLoaderLayout = !!projectData[18]; this._loaderStyle = projectData[19]; this._nextUid = projectData[21]; this._pauseOnBlur = projectData[22]; this._assetManager._SetAudioFiles(projectData[7], projectData[25]); this._assetManager._SetMediaSubfolder(projectData[8]); this._assetManager._SetFontsSubfolder(projectData[32]); this._assetManager._SetIconsSubfolder(projectData[28]); this._assetManager._SetWebFonts(projectData[29]); if (this._canvasManager) { this._canvasManager.SetFullscreenMode(C3.CanvasManager._FullscreenModeNumberToString(projectData[12])); this._canvasManager.SetFullscreenScalingQuality(projectData[23] ? "high" : "low"); this._canvasManager.SetMipmapsEnabled(projectData[24] !== 0); this._canvasManager._SetGPUPowerPreference(projectData[34]) } this._pluginManager.CreateSystemPlugin(); this._objectReferenceTable = self.C3_GetObjectRefTable(); for (const pluginData of projectData[2]) this._pluginManager.CreatePlugin(pluginData); this._objectReferenceTable = self.C3_GetObjectRefTable(); this._LoadJsPropNameTable(); for (const objectClassData of projectData[3]) { const objectClass = C3.ObjectClass.Create(this, this._allObjectClasses.length, objectClassData); this._allObjectClasses.push(objectClass); this._objectClassesByName.set(objectClass.GetName().toLowerCase(), objectClass); this._objectClassesBySid.set(objectClass.GetSID(), objectClass) } for (const familyData of projectData[4]) { const familyType = this._allObjectClasses[familyData[0]]; familyType._LoadFamily(familyData) } for (const containerData of projectData[27]) { const containerTypes = containerData.map(index=>this._allObjectClasses[index]); this._allContainers.push(C3.New(C3.Container, this, containerTypes)) } for (const objectClass of this._allObjectClasses) objectClass._OnAfterCreate(); for (const layoutData of projectData[5]) this._layoutManager.Create(layoutData); const firstLayoutName = projectData[1]; if (firstLayoutName) { const firstLayout = this._layoutManager.GetLayoutByName(firstLayoutName); if (firstLayout) this._layoutManager.SetFirstLayout(firstLayout) } for (const timelineData of projectData[33]) this._timelineManager.Create(timelineData); for (const transitionData of projectData[35]) this._transitionManager.Create(transitionData); this._InitScriptInterfaces(); for (const eventSheetData of projectData[6]) this._eventSheetManager.Create(eventSheetData); this._eventSheetManager._PostInit(); this._InitGlobalVariableScriptInterface(); C3.clearArray(this._objectReferenceTable); this.FlushPendingInstances(); let targetOrientation = "any"; const orientations = projectData[20]; if (orientations === 1) targetOrientation = "portrait"; else if (orientations === 2) targetOrientation = "landscape"; this.PostComponentMessageToDOM("runtime", "set-target-orientation", { "targetOrientation": targetOrientation }) } GetLoaderStyle() { return this._loaderStyle } IsFBInstantAvailable() { return this._isFBInstantAvailable } IsLoading() { return this._isLoading } AddLoadPromise(promise) { this._additionalLoadPromises.push(promise) } SetUsingCreatePromises(e) { this._isUsingCreatePromises = !!e } AddCreatePromise(promise) { if (!this._isUsingCreatePromises) return; this._additionalCreatePromises.push(promise) } GetCreatePromises() { return this._additionalCreatePromises } _GetNextFamilyIndex() { return this._familyCount++ } GetFamilyCount() { return this._familyCount } _AddEffectList(el) { this._allEffectLists.push(el) } _GetAllEffectLists() { return this._allEffectLists } async _InitialiseCanvas(opts) { if (!this._canvasManager) return; await this._canvasManager.CreateCanvas(opts); this._canvasManager.InitLoadingScreen(this._loaderStyle) } async _MaybeLoadOpusDecoder() { if (this._assetManager.IsAudioFormatSupported("audio/webm; codecs=opus")) return; let wasmBlob = null; let wasmBuffer = null; try { if (this.IsiOSCordova() && location.protocol === "file:") wasmBuffer = await this._assetManager.CordovaFetchLocalFileAsArrayBuffer(this._opusWasmBinaryUrl); else wasmBlob = await this._assetManager.FetchBlob(this._opusWasmBinaryUrl) } catch (err) { console.info("Failed to fetch Opus decoder WASM; assuming project has no Opus audio.", err); return } if (wasmBuffer) this.AddJobWorkerBuffer(wasmBuffer, "opus-decoder-wasm"); else this.AddJobWorkerBlob(wasmBlob, "opus-decoder-wasm"); await this.AddJobWorkerScripts([this._opusWasmScriptUrl]) } async _WasmDecodeWebMOpus(arrayBuffer) { const result = await this.AddJob("OpusDecode", { "arrayBuffer": arrayBuffer }, [arrayBuffer]); return result } async Start() { this._hasStarted = true; this._startTime = Date.now(); if (this._usesLoaderLayout) { for (const objectClass of this._allObjectClasses) if (!objectClass.IsFamily() && !objectClass.IsOnLoaderLayout() && objectClass.IsWorldType()) objectClass.OnCreate(); this._assetManager.WaitForAllToLoad().then(()=>{ this._isLoading = false; this._OnLoadFinished() } ) } else this._isLoading = false; this._assetManager.SetInitialLoadFinished(); if (this.IsDebug()) C3Debugger.RuntimeInit(ife); for (const layout of this._layoutManager.GetAllLayouts()) layout._CreateGlobalNonWorlds(); const firstLayout = this._layoutManager.GetFirstLayout(); await firstLayout._Load(null, this.GetWebGLRenderer()); await firstLayout._StartRunning(true); this._fpsLastTime = performance.now(); if (!this._usesLoaderLayout) this._OnLoadFinished(); const state = await this.PostComponentMessageToDOMAsync("runtime", "before-start-ticking"); if (state["isSuspended"]) this._suspendCount++; else this.Tick() } _OnLoadFinished() { this.Trigger(C3.Plugins.System.Cnds.OnLoadFinished, null, null); this.PostComponentMessageToDOM("runtime", "register-sw") } GetObjectReference(index) { index = Math.floor(index); const objRefTable = this._objectReferenceTable; if (index < 0 || index >= objRefTable.length) throw new Error("invalid object reference"); return objRefTable[index] } _LoadJsPropNameTable() { for (const entry of self.C3_JsPropNameTable) { const propName = C3.first(Object.keys(entry)); this._jsPropNameTable.push(propName) } } GetJsPropName(index) { index = Math.floor(index); const jsPropNameTable = this._jsPropNameTable; if (index < 0 || index >= jsPropNameTable.length) throw new Error("invalid prop reference"); return jsPropNameTable[index] } HasDOM() { return this._hasDom } IsHeadless() { return this._isHeadless } IsInWorker() { return this._isInWorker } GetBaseURL() { return this._baseUrl } GetEventSheetManager() { return this._eventSheetManager } GetEventStack() { return this._eventSheetManager.GetEventStack() } GetCurrentEventStackFrame() { return this._eventSheetManager.GetCurrentEventStackFrame() } GetCurrentEvent() { return this._eventSheetManager.GetCurrentEvent() } GetCurrentCondition() { return this._eventSheetManager.GetCurrentCondition() } IsCurrentConditionFirst() { return this.GetCurrentEventStackFrame().GetConditionIndex() === 0 } GetCurrentAction() { return this._eventSheetManager.GetCurrentAction() } GetPluginManager() { return this._pluginManager } GetSystemPlugin() { return this._pluginManager.GetSystemPlugin() } GetObjectClassByIndex(i) { i = Math.floor(i); if (i < 0 || i >= this._allObjectClasses.length) throw new RangeError("invalid index"); return this._allObjectClasses[i] } GetObjectClassByName(name) { return this._objectClassesByName.get(name.toLowerCase()) || null } GetObjectClassBySID(sid) { return this._objectClassesBySid.get(sid) || null } GetSingleGlobalObjectClassByCtor(ctor) { const plugin = this._pluginManager.GetPluginByConstructorFunction(ctor); if (!plugin) return null; return plugin.GetSingleGlobalObjectClass() } GetAllObjectClasses() { return this._allObjectClasses } Dispatcher() { return this._dispatcher } UserScriptDispatcher() { return this._userScriptDispatcher } DispatchUserScriptEvent(e) { e.runtime = this.GetIRuntime(); const shouldTime = this.IsDebug() && !this._eventSheetManager.IsInEventEngine(); if (shouldTime) C3Debugger.StartMeasuringScriptTime(); this._userScriptDispatcher.dispatchEvent(e); if (shouldTime) C3Debugger.AddScriptTime() } DispatchUserScriptEventAsyncWait(e) { e.runtime = this.GetIRuntime(); return this._userScriptDispatcher.dispatchEventAndWaitAsync(e) } GetOriginalViewportWidth() { return this._originalViewportWidth } GetOriginalViewportHeight() { return this._originalViewportHeight } SetOriginalViewportSize(w, h) { this._originalViewportWidth = w; this._originalViewportHeight = h } GetViewportWidth() { return this._viewportWidth } GetViewportHeight() { return this._viewportHeight } SetViewportSize(w, h) { this._viewportWidth = w; this._viewportHeight = h } _SetDevicePixelRatio(r) { this._devicePixelRatio = r } GetDevicePixelRatio() { return this._devicePixelRatio } GetParallaxXOrigin() { return this._parallaxXorigin } GetParallaxYOrigin() { return this._parallaxYorigin } GetCanvasManager() { return this._canvasManager } GetDrawWidth() { if (!this._canvasManager) return this._viewportWidth; return this._canvasManager.GetDrawWidth() } GetDrawHeight() { if (!this._canvasManager) return this._viewportHeight; return this._canvasManager.GetDrawHeight() } GetRenderScale() { if (!this._canvasManager) return 1; return this._canvasManager.GetRenderScale() } GetDisplayScale() { if (!this._canvasManager) return 1; return this._canvasManager.GetDisplayScale() } GetCanvasClientX() { if (!this._canvasManager) return 0; return this._canvasManager.GetCanvasClientX() } GetCanvasClientY() { if (!this._canvasManager) return 0; return this._canvasManager.GetCanvasClientY() } GetCanvasCssWidth() { if (!this._canvasManager) return 0; return this._canvasManager.GetCssWidth() } GetCanvasCssHeight() { if (!this._canvasManager) return 0; return this._canvasManager.GetCssHeight() } GetFullscreenMode() { if (!this._canvasManager) return "off"; return this._canvasManager.GetFullscreenMode() } GetAdditionalRenderTarget(opts) { if (!this._canvasManager) return null; return this._canvasManager.GetAdditionalRenderTarget(opts) } ReleaseAdditionalRenderTarget(renderTarget) { if (!this._canvasManager) return; this._canvasManager.ReleaseAdditionalRenderTarget(renderTarget) } _SetUsesAnyBackgroundBlending(u) { this._usesAnyBackgroundBlending = !!u } UsesAnyBackgroundBlending() { return this._usesAnyBackgroundBlending } GetGPUUtilisation() { if (!this._canvasManager) return NaN; return this._canvasManager.GetGPUUtilisation() } IsLinearSampling() { return this.GetSampling() !== "nearest" } GetFramerateMode() { return this._framerateMode } GetCompositingMode() { return this._compositingMode } GetSampling() { return this._sampling } UsesLoaderLayout() { return this._usesLoaderLayout } GetLoadingLogoFilename() { return this._loadingLogoFilename } GetLayoutManager() { return this._layoutManager } GetMainRunningLayout() { return this._layoutManager.GetMainRunningLayout() } GetTimelineManager() { return this._timelineManager } GetTransitionManager() { return this._transitionManager } GetAssetManager() { return this._assetManager } LoadImage(opts) { return this._assetManager.LoadImage(opts) } CreateInstance(objectClass, layer, x, y) { return this.CreateInstanceFromData(objectClass, layer, false, x, y) } CreateInstanceFromData(instData_or_objectClass, layer, isStartupInstance, x, y, skipSiblings) { let instData = null; let objectClass = null; if (instData_or_objectClass instanceof C3.ObjectClass) { objectClass = instData_or_objectClass; if (objectClass.IsFamily()) { const members = objectClass.GetFamilyMembers(); const i = Math.floor(this.Random() * members.length); objectClass = members[i] } instData = objectClass.GetDefaultInstanceData() } else { instData = instData_or_objectClass; objectClass = this.GetObjectClassByIndex(instData[1]) } const isWorld = objectClass.GetPlugin().IsWorldType(); if (this._isLoading && isWorld && !objectClass.IsOnLoaderLayout()) return null; const originalLayer = layer; if (!isWorld) layer = null; let uid; if (isStartupInstance && !skipSiblings && instData && !this._instancesByUid.has(instData[2])) uid = instData[2]; else uid = this._nextUid++; const worldData = instData ? instData[0] : null; const inst = C3.New(C3.Instance, { runtime: this, objectType: objectClass, layer: layer, worldData, instVarData: instData ? instData[3] : null, uid: uid }); this._instancesByUid.set(uid, inst); let wi = null; if (isWorld) { wi = inst.GetWorldInfo(); if (typeof x !== "undefined" && typeof y !== "undefined") { wi.SetX(x); wi.SetY(y) } objectClass._SetAnyCollisionCellChanged(true) } if (layer) { layer._AddInstance(inst, true); if (layer.GetParallaxX() !== 1 || layer.GetParallaxY() !== 1) objectClass._SetAnyInstanceParallaxed(true); layer.GetLayout().MaybeLoadTexturesFor(objectClass) } this._objectCount++; if (objectClass.IsInContainer() && !isStartupInstance && !skipSiblings) { for (const containerType of objectClass.GetContainer().objectTypes()) { if (containerType === objectClass) continue; const siblingInst = this.CreateInstanceFromData(containerType, originalLayer, false, wi ? wi.GetX() : x, wi ? wi.GetY() : y, true); inst._AddSibling(siblingInst) } for (const s of inst.siblings()) { s._AddSibling(inst); for (const s2 of inst.siblings()) if (s !== s2) s._AddSibling(s2) } } objectClass._SetIIDsStale(); const instPropertyData = instData ? C3.cloneArray(instData[5]) : null; const behPropertyData = instData ? instData[4].map(bp=>C3.cloneArray(bp)) : null; const hasTilemap = isWorld && worldData && worldData.length === 14; if (hasTilemap) inst._SetHasTilemap(); inst._CreateSdkInstance(instPropertyData, behPropertyData); if (hasTilemap) { const tilemapData = worldData[13]; inst.GetSdkInstance().LoadTilemapData(tilemapData[2], tilemapData[0], tilemapData[1]) } this._instancesPendingCreate.push(inst); this._hasPendingInstances = true; if (this.IsDebug()) C3Debugger.InstanceCreated(inst); return inst } DestroyInstance(inst) { if (this._instancesToReleaseAtEndOfTick.has(inst)) return; const objectClass = inst.GetObjectClass(); let s = this._instancesPendingDestroy.get(objectClass); if (s) { if (s.has(inst)) return; s.add(inst) } else { s = new Set; s.add(inst); this._instancesPendingDestroy.set(objectClass, s) } if (this.IsDebug()) C3Debugger.InstanceDestroyed(inst); inst._MarkDestroyed(); this._hasPendingInstances = true; if (inst.IsInContainer()) for (const s of inst.siblings()) this.DestroyInstance(s); for (const c of inst.children()) if (c.GetDestroyWithParent()) this.DestroyInstance(c); if (!this._layoutManager.IsEndingLayout() && !this._isLoadingState) { const eventSheetManager = this.GetEventSheetManager(); eventSheetManager.BlockFlushingInstances(true); inst._TriggerOnDestroyed(); eventSheetManager.BlockFlushingInstances(false) } inst._FireDestroyedScriptEvents(this._layoutManager.IsEndingLayout()) } FlushPendingInstances() { if (!this._hasPendingInstances) return; this._isFlushingPendingInstances = true; this._FlushInstancesPendingCreate(); this._FlushInstancesPendingDestroy(); this._isFlushingPendingInstances = false; this._hasPendingInstances = false; this.UpdateRender() } _FlushInstancesPendingCreate() { for (const inst of this._instancesPendingCreate) { const objectType = inst.GetObjectClass(); objectType._AddInstance(inst); for (const family of objectType.GetFamilies()) { family._AddInstance(inst); family._SetIIDsStale() } } C3.clearArray(this._instancesPendingCreate) } _FlushInstancesPendingDestroy() { this._dispatcher.SetDelayRemoveEventsEnabled(true); for (const [objectClass,s] of this._instancesPendingDestroy.entries()) { this._FlushInstancesPendingDestroyForObjectClass(objectClass, s); s.clear() } this._instancesPendingDestroy.clear(); this._dispatcher.SetDelayRemoveEventsEnabled(false) } _FlushInstancesPendingDestroyForObjectClass(objectClass, s) { for (const inst of s) { const instanceDestroyEvent = this._eventObjects["instancedestroy"]; instanceDestroyEvent.instance = inst; this._dispatcher.dispatchEvent(instanceDestroyEvent); this._instancesByUid.delete(inst.GetUID()); const wi = inst.GetWorldInfo(); if (wi) { wi._RemoveFromCollisionCells(); wi._RemoveFromRenderCells() } this._instancesToReleaseAtEndOfTick.add(inst); this._objectCount-- } C3.arrayRemoveAllInSet(objectClass.GetInstances(), s); objectClass._SetIIDsStale(); this._instancesToReleaseAffectedObjectClasses.add(objectClass); if (objectClass.GetInstances().length === 0) objectClass._SetAnyInstanceParallaxed(false); for (const family of objectClass.GetFamilies()) { C3.arrayRemoveAllInSet(family.GetInstances(), s); family._SetIIDsStale(); this._instancesToReleaseAffectedObjectClasses.add(family) } if (objectClass.GetPlugin().IsWorldType()) { const layers = new Set([...s].map(i=>i.GetWorldInfo().GetLayer())); for (const layer of layers) layer._RemoveAllInstancesInSet(s) } } _GetInstancesPendingCreate() { return this._instancesPendingCreate } _GetNewUID() { return this._nextUid++ } _MapInstanceByUID(uid, inst) { this._instancesByUid.set(uid, inst) } _OnWebGLContextLost() { this._dispatcher.dispatchEvent(C3.New(C3.Event, "webglcontextlost")); this.SetSuspended(true); for (const objectClass of this._allObjectClasses) if (!objectClass.IsFamily() && objectClass.HasLoadedTextures()) objectClass.ReleaseTextures(); const runningLayout = this.GetMainRunningLayout(); if (runningLayout) runningLayout._OnWebGLContextLost(); C3.ImageInfo.OnWebGLContextLost(); C3.ImageAsset.OnWebGLContextLost() } async _OnWebGLContextRestored() { await this.GetMainRunningLayout()._Load(null, this.GetWebGLRenderer()); this._dispatcher.dispatchEvent(C3.New(C3.Event, "webglcontextrestored")); this.SetSuspended(false); this.UpdateRender() } _OnVisibilityChange(e) { this.SetSuspended(e["hidden"]) } _OnWindowBlur(e) { if (!this.IsPreview() || !this._pauseOnBlur || C3.Platform.IsMobile) return; if (!e.data["parentHasFocus"]) { this.SetSuspended(true); this._isPausedOnBlur = true } } _OnWindowFocus() { if (!this._isPausedOnBlur) return; this.SetSuspended(false); this._isPausedOnBlur = false } _RequestAnimationFrame() { const tickCallbacks = this._tickCallbacks; if (this._framerateMode === "vsync") { if (this._rafId === -1) this._rafId = self.requestAnimationFrame(tickCallbacks.normal) } else if (this._framerateMode === "unlimited-tick") { if (this._ruafId === -1) this._ruafId = C3.RequestUnlimitedAnimationFrame(tickCallbacks.tickOnly); if (this._rafId === -1) this._rafId = self.requestAnimationFrame(tickCallbacks.renderOnly) } else if (this._ruafId === -1) this._ruafId = C3.RequestUnlimitedAnimationFrame(tickCallbacks.normal) } _CancelAnimationFrame() { if (this._rafId !== -1) { self.cancelAnimationFrame(this._rafId); this._rafId = -1 } if (this._ruafId !== -1) { C3.CancelUnlimitedAnimationFrame(this._ruafId); this._ruafId = -1 } } IsSuspended() { return this._suspendCount > 0 } SetSuspended(s) { const wasSuspended = this.IsSuspended(); this._suspendCount += s ? 1 : -1; if (this._suspendCount < 0) this._suspendCount = 0; const isSuspended = this.IsSuspended(); if (!wasSuspended && isSuspended) { console.log("[Construct 3] Suspending"); this._CancelAnimationFrame(); this._dispatcher.dispatchEvent(C3.New(C3.Event, "suspend")); this.Trigger(C3.Plugins.System.Cnds.OnSuspend, null, null) } else if (wasSuspended && !isSuspended) { console.log("[Construct 3] Resuming"); const now = performance.now(); this._lastTickTime = now; this._fpsLastTime = now; this._fpsFrameCount = 0; this._fps = 0; this._mainThreadTime = 0; this._mainThreadTimeCounter = 0; this._dispatcher.dispatchEvent(C3.New(C3.Event, "resume")); this.Trigger(C3.Plugins.System.Cnds.OnResume, null, null); if (!this.HitBreakpoint()) this.Tick(now) } } _AddBehInstToTick(behSdkInst) { this._behInstsToTick.Add(behSdkInst) } _AddBehInstToPostTick(behSdkInst) { this._behInstsToPostTick.Add(behSdkInst) } _AddBehInstToTick2(behSdkInst) { this._behInstsToTick2.Add(behSdkInst) } _RemoveBehInstToTick(behSdkInst) { this._behInstsToTick.Remove(behSdkInst) } _RemoveBehInstToPostTick(behSdkInst) { this._behInstsToPostTick.Remove(behSdkInst) } _RemoveBehInstToTick2(behSdkInst) { this._behInstsToTick2.Remove(behSdkInst) } _BehaviorTick() { this._behInstsToTick.SetQueueingEnabled(true); for (const bi of this._behInstsToTick) bi.Tick(); this._behInstsToTick.SetQueueingEnabled(false) } _BehaviorPostTick() { this._behInstsToPostTick.SetQueueingEnabled(true); for (const bi of this._behInstsToPostTick) bi.PostTick(); this._behInstsToPostTick.SetQueueingEnabled(false) } _BehaviorTick2() { this._behInstsToTick2.SetQueueingEnabled(true); for (const bi of this._behInstsToTick2) bi.Tick2(); this._behInstsToTick2.SetQueueingEnabled(false) } *_DebugBehaviorTick() { this._behInstsToTick.SetQueueingEnabled(true); for (const bi of this._behInstsToTick) { const ret = bi.Tick(); if (C3.IsIterator(ret)) yield*ret } this._behInstsToTick.SetQueueingEnabled(false) } *_DebugBehaviorPostTick() { this._behInstsToPostTick.SetQueueingEnabled(true); for (const bi of this._behInstsToPostTick) { const ret = bi.PostTick(); if (C3.IsIterator(ret)) yield*ret } this._behInstsToPostTick.SetQueueingEnabled(false) } *_DebugBehaviorTick2() { this._behInstsToTick2.SetQueueingEnabled(true); for (const bi of this._behInstsToTick2) { const ret = bi.Tick2(); if (C3.IsIterator(ret)) yield*ret } this._behInstsToTick2.SetQueueingEnabled(false) } async Tick(timestamp, isDebugStep, mode) { this._hasStartedTicking = true; const isBackgroundWake = mode === "background-wake"; const shouldRender = mode !== "background-wake" && mode !== "skip-render"; if (!this._hasStarted || this.IsSuspended() && !isDebugStep && !isBackgroundWake) return; const startTime = performance.now(); this._isInTick = true; if (!timestamp) timestamp = startTime; this._MeasureDt(timestamp); const beforePreTickRet = this.Step_BeforePreTick(); if (this.IsDebugging()) await beforePreTickRet; const pretickRet = this._dispatcher.dispatchEventAndWait_AsyncOptional(this._eventObjects["pretick"]); if (pretickRet instanceof Promise) await pretickRet; const afterPreTickRet = this.Step_AfterPreTick(); if (this.IsDebugging()) await afterPreTickRet; if (this._NeedsHandleSaveOrLoad()) await this._HandleSaveOrLoad(); if (this.GetLayoutManager().IsPendingChangeMainLayout()) await this._MaybeChangeLayout(); const runEventsRet = this.Step_RunEventsEtc(); if (this.IsDebugging()) await runEventsRet; if (shouldRender) this.Render(); if (!this.IsSuspended() && !isBackgroundWake) this._RequestAnimationFrame(); this._tickCount++; this._tickCountNoSave++; this._execCount++; this._isInTick = false; this._mainThreadTimeCounter += performance.now() - startTime } async Step_BeforePreTick() { const eventSheetManager = this._eventSheetManager; const isDebug = this.IsDebug(); this.FlushPendingInstances(); eventSheetManager.BlockFlushingInstances(true); this.PushCurrentLayout(this.GetMainRunningLayout()); if (isDebug) C3Debugger.StartMeasuringTime(); if (this.IsDebugging()) await eventSheetManager.DebugRunScheduledWaits(); else eventSheetManager.RunScheduledWaits(); if (isDebug) C3Debugger.AddEventsTime(); this.PopCurrentLayout(); eventSheetManager.BlockFlushingInstances(false); this.FlushPendingInstances(); eventSheetManager.BlockFlushingInstances(true) } async Step_AfterPreTick() { const isDebug = this.IsDebug(); const isDebugging = this.IsDebugging(); const dispatcher = this._dispatcher; const eventObjects = this._eventObjects; const userScriptEventObjects = this._userScriptEventObjects; if (isDebug) C3Debugger.StartMeasuringTime(); if (isDebugging) await this.DebugIterateAndBreak(this._DebugBehaviorTick()); else this._BehaviorTick(); if (isDebugging) await this.DebugIterateAndBreak(this._DebugBehaviorPostTick()); else this._BehaviorPostTick(); if (isDebug) C3Debugger.AddBehaviorTickTime(); if (isDebug) C3Debugger.StartMeasuringTime(); if (isDebugging) await this.DebugFireGeneratorEventAndBreak(eventObjects["tick"]); else dispatcher.dispatchEvent(eventObjects["tick"]); if (isDebug) C3Debugger.AddPluginTickTime(); this._eventSheetManager.BlockFlushingInstances(false); this.DispatchUserScriptEvent(userScriptEventObjects["tick"]) } async Step_RunEventsEtc() { const eventSheetManager = this._eventSheetManager; const dispatcher = this._dispatcher; const eventObjects = this._eventObjects; const isDebug = this.IsDebug(); const isDebugging = this.IsDebugging(); if (isDebug) C3Debugger.StartMeasuringTime(); if (isDebugging) await eventSheetManager.DebugRunEvents(this._layoutManager); else eventSheetManager.RunEvents(this._layoutManager); if (isDebug) C3Debugger.AddEventsTime(); this._collisionEngine.ClearRegisteredCollisions(); if (this._instancesToReleaseAtEndOfTick.size > 0) { dispatcher.SetDelayRemoveEventsEnabled(true); for (const objectClass of this._instancesToReleaseAffectedObjectClasses) objectClass.GetSolStack().RemoveInstances(this._instancesToReleaseAtEndOfTick); this._instancesToReleaseAffectedObjectClasses.clear(); this._eventSheetManager.RemoveInstancesFromScheduledWaits(this._instancesToReleaseAtEndOfTick); for (const inst of this._instancesToReleaseAtEndOfTick) inst.Release(); this._instancesToReleaseAtEndOfTick.clear(); dispatcher.SetDelayRemoveEventsEnabled(false) } this._isLayoutFirstTick = false; eventSheetManager.BlockFlushingInstances(true); if (isDebug) C3Debugger.StartMeasuringTime(); if (isDebugging) await this.DebugIterateAndBreak(this._DebugBehaviorTick2()); else this._BehaviorTick2(); if (isDebug) C3Debugger.AddBehaviorTickTime(); if (isDebug) C3Debugger.StartMeasuringTime(); if (isDebugging) await this.DebugFireGeneratorEventAndBreak(eventObjects["tick2"]); else dispatcher.dispatchEvent(eventObjects["tick2"]); if (isDebug) C3Debugger.AddPluginTickTime(); eventSheetManager.BlockFlushingInstances(false); if (isDebugging) await eventSheetManager.RunQueuedDebugTriggersAsync() } async _MaybeChangeLayout() { const layoutManager = this.GetLayoutManager(); let i = 0; while (layoutManager.IsPendingChangeMainLayout() && i++ < 10) await this._DoChangeLayout(layoutManager.GetPendingChangeMainLayout()) } _MeasureDt(timestamp) { if (this._lastTickTime !== 0) { const msDiff = Math.max(timestamp - this._lastTickTime, 0); this._dt1 = msDiff / 1E3; const maxDt1 = 1 / this._minimumFramerate; if (this._dt1 > .5) this._dt1 = 0; else if (this._dt1 > maxDt1) this._dt1 = maxDt1 } this._lastTickTime = timestamp; this._dt = this._dt1 * this._timeScale; this._gameTime.Add(this._dt); this._wallTime.Add(this._dt1); if (this._canvasManager) this._canvasManager._UpdateTick(); if (timestamp - this._fpsLastTime >= 1E3) { this._fpsLastTime += 1E3; if (timestamp - this._fpsLastTime >= 1E3) this._fpsLastTime = timestamp; this._fps = this._fpsFrameCount; this._fpsFrameCount = 0; this._mainThreadTime = Math.min(this._mainThreadTimeCounter / 1E3, 1); this._mainThreadTimeCounter = 0; if (this._canvasManager) this._canvasManager._Update1sFrameRange(); this._collisionEngine._Update1sStats(); if (this.IsDebug()) C3Debugger.Update1sPerfStats() } this._fpsFrameCount++ } async _DoChangeLayout(changeToLayout) { const dispatcher = this._dispatcher; const layoutManager = this.GetLayoutManager(); const prevLayout = layoutManager.GetMainRunningLayout(); await prevLayout._StopRunning(); prevLayout._Unload(changeToLayout, this.GetWebGLRenderer()); if (prevLayout === changeToLayout) this._eventSheetManager.ClearAllScheduledWaits(); this._collisionEngine.ClearRegisteredCollisions(); dispatcher.dispatchEvent(this._eventObjects["beforelayoutchange"]); C3.Asyncify.SetHighThroughputMode(true); await changeToLayout._Load(prevLayout, this.GetWebGLRenderer()); C3.Asyncify.SetHighThroughputMode(false); await changeToLayout._StartRunning(false); dispatcher.dispatchEvent(this._eventObjects["layoutchange"]); this.UpdateRender(); this._isLayoutFirstTick = true; this.FlushPendingInstances() } UpdateRender() { this._needRender = true } GetWebGLRenderer() { if (!this._canvasManager) return null; return this._canvasManager.GetWebGLRenderer() } GetRenderer() { return this.GetWebGLRenderer() } Render() { if (!this._canvasManager || this._canvasManager.IsWebGLContextLost()) return; const renderer = this.GetWebGLRenderer(); renderer.Start(); renderer.CheckForQueryResults(); if (!this._needRender) { renderer.IncrementFrameNumber(); return } const isDebug = this.IsDebug(); if (isDebug) C3Debugger.StartMeasuringTime(); this._needRender = false; let frameQuery = null; if (renderer.SupportsGPUProfiling()) { frameQuery = this._canvasManager.GetGPUFrameTimingsBuffer().AddTimeElapsedQuery(); renderer.StartQuery(frameQuery) } renderer.SetTextureFillMode(); renderer.SetAlphaBlend(); renderer.SetColorRgba(1, 1, 1, 1); renderer.SetRenderTarget(null); renderer.SetTexture(null); const layout = this._layoutManager.GetMainRunningLayout(); layout.Draw(renderer); if (frameQuery) renderer.EndQuery(frameQuery); renderer.Finish(); if (isDebug) { C3Debugger.AddDrawCallsTime(); C3Debugger.UpdateInspectHighlight() } if (this._canvasManager) this._canvasManager._MaybeTakeSnapshot() } Trigger(method, inst, behaviorType) { if (!this._hasStarted) return false; const isTopLevel = !this._isInTick && !this._eventSheetManager.IsInTrigger(); let startTime = 0; if (isTopLevel) startTime = performance.now(); const isDebug = this.IsDebug(); if (isDebug) this.SetDebuggingEnabled(false); const ret = this._eventSheetManager._Trigger(this._layoutManager, method, inst, behaviorType); if (isTopLevel) { const triggerTime = performance.now() - startTime; this._mainThreadTimeCounter += triggerTime; if (isDebug) C3Debugger.AddTriggersTime(triggerTime) } if (isDebug) this.SetDebuggingEnabled(true); return ret } DebugTrigger(method, inst, behaviorType) { if (!this.IsDebug()) return this.Trigger(method, inst, behaviorType); if (this.HitBreakpoint()) throw new Error("called DebugTrigger() while stopped on breakpoint"); if (!this._isInTick && !this._eventSheetManager.IsInTrigger()) throw new Error("called DebugTrigger() outside of event code - use TriggerAsync() instead"); return this._eventSheetManager._DebugTrigger(this._layoutManager, method, inst, behaviorType) } async TriggerAsync(method, inst, behaviorType) { if (!this.IsDebugging()) return this.Trigger(method, inst, behaviorType); if (!this._hasStarted) return false; if (this.HitBreakpoint()) return this._eventSheetManager.QueueDebugTrigger(method, inst, behaviorType); if (!this.GetMainRunningLayout()) return this._eventSheetManager.QueueTrigger(method, inst, behaviorType); const startTime = performance.now(); const iter = this._eventSheetManager._DebugTrigger(this._layoutManager, method, inst, behaviorType); let result = iter.next(); while (!result.done) { await this.DebugBreak(result.value); result = iter.next() } if (!this.IsSuspended() && !this._eventSheetManager.IsInTrigger()) { await this._eventSheetManager.RunQueuedDebugTriggersAsync(); if (this._hasStartedTicking && !this._isInTick) this._RequestAnimationFrame() } this._mainThreadTimeCounter += performance.now() - startTime; return result.value } FastTrigger(method, inst, value) { const isDebug = this.IsDebug(); if (isDebug) this.SetDebuggingEnabled(false); const ret = this._eventSheetManager._FastTrigger(this._layoutManager, method, inst, value); if (isDebug) this.SetDebuggingEnabled(true); return ret } DebugFastTrigger(method, inst, value) { return this._eventSheetManager._DebugFastTrigger(this._layoutManager, method, inst, value) } ScheduleTriggers(f) { return this._scheduleTriggersThrottle.Add(f) } PushCurrentLayout(layout) { this._currentLayoutStack.push(layout) } PopCurrentLayout() { if (!this._currentLayoutStack.length) throw new Error("layout stack empty"); this._currentLayoutStack.pop() } GetCurrentLayout() { if (!this._currentLayoutStack.length) return this.GetMainRunningLayout(); return this._currentLayoutStack[this._currentLayoutStack.length - 1] } GetDt(inst) { if (!inst || inst.GetTimeScale() === -1) return this._dt; return this._dt1 * inst.GetTimeScale() } _GetDtFast() { return this._dt } GetDt1() { return this._dt1 } GetTimeScale() { return this._timeScale } SetTimeScale(ts) { if (isNaN(ts) || ts < 0) ts = 0; this._timeScale = ts } SetMinimumFramerate(fps) { this._minimumFramerate = C3.clamp(fps, 1, 120) } GetMinimumFramerate() { return this._minimumFramerate } GetFPS() { return this._fps } GetMainThreadTime() { return this._mainThreadTime } GetStartTime() { return this._startTime } GetGameTime() { return this._gameTime.Get() } GetWallTime() { return this._wallTime.Get() } GetTickCount() { return this._tickCount } GetTickCountNoSave() { return this._tickCountNoSave } IncrementExecCount() { ++this._execCount } GetExecCount() { return this._execCount } GetObjectCount() { return this._objectCount } GetProjectName() { return this._projectName } GetProjectVersion() { return this._projectVersion } GetProjectUniqueId() { return this._projectUniqueId } GetAppId() { return this._appId } GetInstanceByUID(uid) { if (this._isLoadingState) throw new Error("cannot call while loading state - wait until afterload event"); return this._instancesByUid.get(uid) || null } _RefreshUidMap() { this._instancesByUid.clear(); for (const objectClass of this._allObjectClasses) { if (objectClass.IsFamily()) continue; for (const inst of objectClass.GetInstances()) this._instancesByUid.set(inst.GetUID(), inst) } } IsPreview() { return this._exportType === "preview" } IsDebug() { return this._isDebug } GetExportType() { return this._exportType } IsCordova() { return this._exportType === "cordova" } IsAndroidWebView() { return C3.Platform.OS === "Android" && (this._exportType === "cordova" || this._exportType === "playable-ad" || this._exportType === "instant-games") } IsiOSCordova() { return this._isiOSCordova } IsiOSWebView() { return this._isiOSWebView } GetCollisionEngine() { return this._collisionEngine } GetSolidBehavior() { return this._pluginManager.GetSolidBehavior() } GetJumpthruBehavior() { return this._pluginManager.GetJumpthruBehavior() } IsLayoutFirstTick() { return this._isLayoutFirstTick } SetPixelRoundingEnabled(e) { e = !!e; if (this._isPixelRoundingEnabled === e) return; this._isPixelRoundingEnabled = e; this.UpdateRender() } IsPixelRoundingEnabled() { return this._isPixelRoundingEnabled } SaveToSlot(slotName) { this._saveToSlotName = slotName } LoadFromSlot(slotName) { this._loadFromSlotName = slotName } LoadFromJsonString(str) { this._loadFromJson = str } GetLastSaveJsonString() { return this._lastSaveJson } _NeedsHandleSaveOrLoad() { return !!(this._saveToSlotName || this._loadFromSlotName || this._loadFromJson !== null) } async _HandleSaveOrLoad() { if (this._saveToSlotName) { this.FlushPendingInstances(); await this._DoSaveToSlot(this._saveToSlotName); this._ClearSaveOrLoad() } if (this._loadFromSlotName) { await this._DoLoadFromSlot(this._loadFromSlotName); this._ClearSaveOrLoad(); if (this.IsDebug()) C3Debugger.StepIfPausedInDebugger() } if (this._loadFromJson !== null) { this.FlushPendingInstances(); try { await this._DoLoadFromJsonString(this._loadFromJson); this._lastSaveJson = this._loadFromJson; await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadComplete, null); this._lastSaveJson = "" } catch (err) { console.error("[Construct 3] Failed to load state from JSON string: ", err); await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadFailed, null) } this._ClearSaveOrLoad() } } _ClearSaveOrLoad() { this._saveToSlotName = ""; this._loadFromSlotName = ""; this._loadFromJson = null } _GetProjectStorage() { if (!this._projectStorage) this._projectStorage = localforage.createInstance({ name: "c3-localstorage-" + this.GetProjectUniqueId(), description: this.GetProjectName() }); return this._projectStorage } _GetSavegamesStorage() { if (!this._savegamesStorage) this._savegamesStorage = localforage.createInstance({ name: "c3-savegames-" + this.GetProjectUniqueId(), description: this.GetProjectName() }); return this._savegamesStorage } async _DoSaveToSlot(slotName) { const saveJson = await this._SaveToJsonString(); try { await this._GetSavegamesStorage().setItem(slotName, saveJson); console.log("[Construct 3] Saved state to storage (" + saveJson.length + " chars)"); this._lastSaveJson = saveJson; await this.TriggerAsync(C3.Plugins.System.Cnds.OnSaveComplete, null); this._lastSaveJson = "" } catch (err) { console.error("[Construct 3] Failed to save state to storage: ", err); await this.TriggerAsync(C3.Plugins.System.Cnds.OnSaveFailed, null) } } async _DoLoadFromSlot(slotName) { try { const loadJson = await this._GetSavegamesStorage().getItem(slotName); if (!loadJson) throw new Error("empty slot"); console.log("[Construct 3] Loaded state from storage (" + loadJson.length + " chars)"); await this._DoLoadFromJsonString(loadJson); this._lastSaveJson = loadJson; await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadComplete, null); this._lastSaveJson = "" } catch (err) { console.error("[Construct 3] Failed to load state from storage: ", err); await this.TriggerAsync(C3.Plugins.System.Cnds.OnLoadFailed, null) } } async _SaveToJsonString() { const o = { "c3save": true, "version": 1, "rt": { "time": this.GetGameTime(), "walltime": this.GetWallTime(), "timescale": this.GetTimeScale(), "tickcount": this.GetTickCount(), "execcount": this.GetExecCount(), "next_uid": this._nextUid, "running_layout": this.GetMainRunningLayout().GetSID(), "start_time_offset": Date.now() - this._startTime }, "types": {}, "layouts": {}, "events": this._eventSheetManager._SaveToJson(), "timelines": this._timelineManager._SaveToJson(), "user_script_data": null }; for (const objectClass of this._allObjectClasses) { if (objectClass.IsFamily() || objectClass.HasNoSaveBehavior()) continue; o["types"][objectClass.GetSID().toString()] = objectClass._SaveToJson() } for (const layout of this._layoutManager.GetAllLayouts()) o["layouts"][layout.GetSID().toString()] = layout._SaveToJson(); const saveEvent = this._CreateUserScriptEvent("save"); saveEvent.saveData = null; await this.DispatchUserScriptEventAsyncWait(saveEvent); o["user_script_data"] = saveEvent.saveData; return JSON.stringify(o) } IsLoadingState() { return this._isLoadingState } _TriggerOnCreateAfterLoad(arr) { C3.shallowAssignArray(this._triggerOnCreateAfterLoad, arr) } async _DoLoadFromJsonString(jsonStr) { const o = JSON.parse(jsonStr); if (o["c2save"]) throw new Error("C2 saves are incompatible with C3 runtime"); if (!o["c3save"]) throw new Error("not valid C3 save data"); if (o["version"] > 1) throw new Error("C3 save data from future version"); this._isLoadingState = true; const rt = o["rt"]; this._gameTime.Set(rt["time"]); this._wallTime.Set(rt["walltime"]); this._timeScale = rt["timescale"]; this._tickCount = rt["tickcount"]; this._execCount = rt["execcount"]; this._startTime = Date.now() - rt["start_time_offset"]; const layoutSid = rt["running_layout"]; if (layoutSid !== this.GetMainRunningLayout().GetSID()) { const changeToLayout = this._layoutManager.GetLayoutBySID(layoutSid); if (changeToLayout) await this._DoChangeLayout(changeToLayout); else return } for (const [sidStr,data] of Object.entries(o["types"])) { const sid = parseInt(sidStr, 10); const objectClass = this.GetObjectClassBySID(sid); if (!objectClass || objectClass.IsFamily() || objectClass.HasNoSaveBehavior()) continue; objectClass._LoadFromJson(data) } this.FlushPendingInstances(); this._RefreshUidMap(); this._isLoadingState = false; this._nextUid = rt["next_uid"]; for (const [sidStr,data] of Object.entries(o["layouts"])) { const sid = parseInt(sidStr, 10); const layout = this._layoutManager.GetLayoutBySID(sid); if (!layout) continue; layout._LoadFromJson(data) } this._eventSheetManager._LoadFromJson(o["events"]); for (const inst of this._triggerOnCreateAfterLoad) { inst._TriggerOnCreated(); inst.SetupInitialSceneGraphConnections() } C3.clearArray(this._triggerOnCreateAfterLoad); for (const objectClass of this._allObjectClasses) { if (objectClass.IsFamily() || !objectClass.IsInContainer()) continue; for (const inst of objectClass.GetInstances()) { const iid = inst.GetIID(); for (const otherType of objectClass.GetContainer().objectTypes()) { if (otherType === objectClass) continue; const otherInstances = otherType.GetInstances(); if (iid < 0 || iid >= otherInstances.length) throw new Error("missing sibling instance"); inst._AddSibling(otherInstances[iid]) } } } this._timelineManager._LoadFromJson(o["timelines"]); this._dispatcher.dispatchEvent(C3.New(C3.Event, "afterload")); const loadEvent = this._CreateUserScriptEvent("load"); loadEvent.saveData = o["user_script_data"]; await this.DispatchUserScriptEventAsyncWait(loadEvent); this.UpdateRender() } async AddJobWorkerScripts(scripts) { const blobs = await Promise.all(scripts.map(url=>this._assetManager.FetchBlob(url))); const blobUrls = blobs.map(b=>URL.createObjectURL(b)); this._jobScheduler.ImportScriptsToJobWorkers(blobUrls) } AddJobWorkerBlob(blob, id) { this._jobScheduler.SendBlobToJobWorkers(blob, id) } AddJobWorkerBuffer(buffer, id) { this._jobScheduler.SendBufferToJobWorkers(buffer, id) } AddJob(type, params, transferables) { return this._jobScheduler.AddJob(type, params, transferables) } BroadcastJob(type, params, transferables) { return this._jobScheduler.BroadcastJob(type, params, transferables) } InvokeDownload(url, filename) { this.PostComponentMessageToDOM("runtime", "invoke-download", { "url": url, "filename": filename }) } async RasterSvgImage(blob, imageWidth, imageHeight, surfaceWidth, surfaceHeight, imageBitmapOpts) { surfaceWidth = surfaceWidth || imageWidth; surfaceHeight = surfaceHeight || imageHeight; if (this.IsInWorker()) { const result = await this.PostComponentMessageToDOMAsync("runtime", "raster-svg-image", { "blob": blob, "imageWidth": imageWidth, "imageHeight": imageHeight, "surfaceWidth": surfaceWidth, "surfaceHeight": surfaceHeight, "imageBitmapOpts": imageBitmapOpts }); return result["imageBitmap"] } else { const canvas = await self["C3_RasterSvgImageBlob"](blob, imageWidth, imageHeight, surfaceWidth, surfaceHeight); if (imageBitmapOpts) return await self.createImageBitmap(canvas, imageBitmapOpts); else return canvas } } async GetSvgImageSize(blob) { if (this.IsInWorker()) return await this.PostComponentMessageToDOMAsync("runtime", "get-svg-image-size", { "blob": blob }); else return await self["C3_GetSvgImageSize"](blob) } RequestDeviceOrientationEvent() { if (this._didRequestDeviceOrientationEvent) return; this._didRequestDeviceOrientationEvent = true; this.PostComponentMessageToDOM("runtime", "enable-device-orientation") } RequestDeviceMotionEvent() { if (this._didRequestDeviceMotionEvent) return; this._didRequestDeviceMotionEvent = true; this.PostComponentMessageToDOM("runtime", "enable-device-motion") } Random() { return this._randomNumberCallback() } SetRandomNumberGeneratorCallback(f) { this._randomNumberCallback = f } _GetRemotePreviewStatusInfo() { return { "fps": this.GetFPS(), "cpu": this.GetMainThreadTime(), "gpu": this.GetGPUUtilisation(), "layout": this.GetMainRunningLayout() ? this.GetMainRunningLayout().GetName() : "", "renderer": this.GetWebGLRenderer().GetUnmaskedRenderer() } } HitBreakpoint() { if (!this.IsDebug()) return false; return C3Debugger.HitBreakpoint() } DebugBreak(eventObject) { if (!this.IsDebugging()) return Promise.resolve(); return C3Debugger.DebugBreak(eventObject) } DebugBreakNext() { if (!this.IsDebugging()) return false; return C3Debugger.BreakNext() } SetDebugBreakpointsEnabled(e) { this._breakpointsEnabled = !!e; this._UpdateDebuggingFlag() } AreDebugBreakpointsEnabled() { return this._breakpointsEnabled } IsDebugging() { return this._isDebugging } SetDebuggingEnabled(d) { if (d) this._debuggingDisabled--; else this._debuggingDisabled++; this._UpdateDebuggingFlag() } _UpdateDebuggingFlag() { this._isDebugging = this.IsDebug() && this._breakpointsEnabled && this._debuggingDisabled === 0 } IsCPUProfiling() { return this.IsDebug() && C3Debugger.IsCPUProfiling() } IsGPUProfiling() { return this.IsDebug() && this.GetWebGLRenderer().SupportsGPUProfiling() && C3Debugger.IsGPUProfiling() } async DebugIterateAndBreak(iter) { if (!iter) return; for (const breakEventObject of iter) await this.DebugBreak(breakEventObject) } DebugFireGeneratorEventAndBreak(event) { return this.DebugIterateAndBreak(this._dispatcher.dispatchGeneratorEvent(event)) } _InvokeFunctionFromJS(e) { return this._eventSheetManager._InvokeFunctionFromJS(e["name"], e["params"]) } GetIRuntime() { return this._iRuntime } _CreateUserScriptEvent(name) { const e = C3.New(C3.Event, name, false); e.runtime = this._iRuntime; return e } _InitScriptInterfaces() { const objectDescriptors = {}; for (const objectClass of this._allObjectClasses) objectDescriptors[objectClass.GetJsPropName()] = { value: objectClass.GetIObjectClass(), enumerable: true, writable: false }; const objects = Object.create(Object.prototype, objectDescriptors); this._iRuntime = new self.IRuntime(this,objects); this._userScriptEventObjects = { "tick": this._CreateUserScriptEvent("tick") } } _InitGlobalVariableScriptInterface() { const globalVarDescriptors = {}; for (const globalVar of this.GetEventSheetManager().GetAllGlobalVariables()) globalVarDescriptors[globalVar.GetJsPropName()] = globalVar._GetScriptInterfaceDescriptor(); this._iRuntime._InitGlobalVars(globalVarDescriptors) } _GetCommonScriptInterfaces() { return this._commonScriptInterfaces } _MapScriptInterface(interface_, class_) { this._interfaceMap.set(interface_, class_) } _UnwrapScriptInterface(interface_) { return this._interfaceMap.get(interface_) } } ; self["C3_CreateRuntime"] = C3.Runtime.Create; self["C3_InitRuntime"] = (runtime,opts)=>runtime.Init(opts) } ;'use strict'; { const C3 = self.C3; C3.JobSchedulerRuntime = class JobSchedulerRuntime extends C3.DefendedBase { constructor(runtime, data) { super(); this._runtime = runtime; this._jobPromises = new Map; this._nextJobId = 0; this._inputPort = data["inputPort"]; data["outputPort"].onmessage = e=>this._OnJobWorkerMessage(e); this._maxNumWorkers = data["maxNumWorkers"]; this._jobWorkerCount = 1; this._isCreatingWorker = false; this._hadErrorCreatingWorker = false } async Init() {} ImportScriptsToJobWorkers(scripts) { this._inputPort.postMessage({ "type": "_import_scripts", "scripts": scripts }) } SendBlobToJobWorkers(blob, id) { this._inputPort.postMessage({ "type": "_send_blob", "blob": blob, "id": id }) } SendBufferToJobWorkers(buffer, id) { this._inputPort.postMessage({ "type": "_send_buffer", "buffer": buffer, "id": id }, [buffer]) } AddJob(type, params, transferables, progressHandler, abortDisposable) { if (!transferables) transferables = []; const jobId = this._nextJobId++; const job = { "type": type, "isBroadcast": false, "jobId": jobId, "params": params, "transferables": transferables }; const promise = new Promise((resolve,reject)=>{ this._jobPromises.set(jobId, { resolve: resolve, progress: progressHandler, reject: reject, cancelled: false }) } ); if (abortDisposable) abortDisposable.SetAction(()=>this._CancelJob(jobId)); this._inputPort.postMessage(job, transferables); this._MaybeCreateExtraWorker(); return promise } BroadcastJob(type, params, transferables) { if (!transferables) transferables = []; const jobId = this._nextJobId++; const job = { "type": type, "isBroadcast": true, "jobId": jobId, "params": params, "transferables": transferables }; this._inputPort.postMessage(job, transferables) } _CancelJob(jobId) { const job = this._jobPromises.get(jobId); if (job) { job.cancelled = true; job.resolve = null; job.progress = null; job.reject = null; this._inputPort.postMessage({ "type": "_cancel", "jobId": jobId }) } } _OnJobWorkerMessage(e) { const msg = e.data; const type = msg["type"]; const id = msg["jobId"]; switch (type) { case "result": this._OnJobResult(id, msg["result"]); break; case "progress": this._OnJobProgress(id, msg["progress"]); break; case "error": this._OnJobError(id, msg["error"]); break; case "ready": this._OnJobWorkerReady(); break; default: throw new Error(`unknown message from worker '${type}'`); } } _OnJobResult(jobId, result) { const p = this._jobPromises.get(jobId); if (!p) throw new Error("invalid job ID"); if (!p.cancelled) p.resolve(result); this._jobPromises.delete(jobId) } _OnJobProgress(jobId, progress) { const p = this._jobPromises.get(jobId); if (!p) throw new Error("invalid job ID"); if (!p.cancelled && p.progress) p.progress(progress) } _OnJobError(jobId, error) { const p = this._jobPromises.get(jobId); if (!p) throw new Error("invalid job ID"); if (!p.cancelled) p.reject(error); this._jobPromises.delete(jobId) } _OnJobWorkerReady() { if (!this._isCreatingWorker) return; this._isCreatingWorker = false; this._jobWorkerCount++; if (this._jobWorkerCount < this._maxNumWorkers) this._MaybeCreateExtraWorker(); else this._inputPort.postMessage({ "type": "_no_more_workers" }) } async _MaybeCreateExtraWorker() { if (this._jobWorkerCount >= this._maxNumWorkers || this._isCreatingWorker || this._hadErrorCreatingWorker || this._jobPromises.size <= this._jobWorkerCount) return; try { this._isCreatingWorker = true; const result = await this._runtime.PostComponentMessageToDOMAsync("runtime", "create-job-worker"); result["outputPort"].onmessage = e=>this._OnJobWorkerMessage(e) } catch (err) { this._hadErrorCreatingWorker = true; this._isCreatingWorker = false; console.error(`[Construct 3] Failed to create job worker; stopping creating any more (created ${this._jobWorkerCount} so far)`, err) } } } } ;self["C3_Shaders"] = {}; self["C3_Shaders"]["hsladjust"] = { src: "varying mediump vec2 vTex;\nuniform lowp sampler2D samplerFront;\nprecision mediump float;\nuniform float huerotate;\nuniform float satadjust;\nuniform float lumadjust;\nvec3 rgb_to_hsl(vec3 color)\n{\nvec3 hsl = vec3(0.0, 0.0, 0.0);\nfloat fmin = min(min(color.r, color.g), color.b);\nfloat fmax = max(max(color.r, color.g), color.b);\nfloat delta = fmax - fmin;\nhsl.z = (fmax + fmin) / 2.0;\nif (delta == 0.0)\n{\nhsl.x = 0.0;\nhsl.y = 0.0;\n}\nelse\n{\nif (hsl.z < 0.5)\nhsl.y = delta / (fmax + fmin);\nelse\nhsl.y = delta / (2.0 - fmax - fmin);\nfloat dR = (((fmax - color.r) / 6.0) + (delta / 2.0)) / delta;\nfloat dG = (((fmax - color.g) / 6.0) + (delta / 2.0)) / delta;\nfloat dB = (((fmax - color.b) / 6.0) + (delta / 2.0)) / delta;\nif (color.r == fmax)\nhsl.x = dB - dG;\nelse if (color.g == fmax)\nhsl.x = (1.0 / 3.0) + dR - dB;\nelse if (color.b == fmax)\nhsl.x = (2.0 / 3.0) + dG - dR;\nif (hsl.x < 0.0)\nhsl.x += 1.0;\nelse if (hsl.x > 1.0)\nhsl.x -= 1.0;\n}\nreturn hsl;\n}\nfloat hue_to_rgb(float f1, float f2, float hue)\n{\nif (hue < 0.0)\nhue += 1.0;\nelse if (hue > 1.0)\nhue -= 1.0;\nfloat ret;\nif ((6.0 * hue) < 1.0)\nret = f1 + (f2 - f1) * 6.0 * hue;\nelse if ((2.0 * hue) < 1.0)\nret = f2;\nelse if ((3.0 * hue) < 2.0)\nret = f1 + (f2 - f1) * ((2.0 / 3.0) - hue) * 6.0;\nelse\nret = f1;\nreturn ret;\n}\nvec3 hsl_to_rgb(vec3 hsl)\n{\nvec3 rgb = vec3(hsl.z);\nif (hsl.y != 0.0)\n{\nfloat f2;\nif (hsl.z < 0.5)\nf2 = hsl.z * (1.0 + hsl.y);\nelse\nf2 = (hsl.z + hsl.y) - (hsl.y * hsl.z);\nfloat f1 = 2.0 * hsl.z - f2;\nrgb.r = hue_to_rgb(f1, f2, hsl.x + (1.0 / 3.0));\nrgb.g = hue_to_rgb(f1, f2, hsl.x);\nrgb.b = hue_to_rgb(f1, f2, hsl.x - (1.0 / 3.0));\n}\nreturn rgb;\n}\nvoid main(void)\n{\nvec4 front = texture2D(samplerFront, vTex);\nvec3 rgb = rgb_to_hsl(front.rgb) + vec3((huerotate > 0.5 ? huerotate - 1.0 : huerotate), 0, (lumadjust - 1.0) * front.a);\nrgb.y *= satadjust;\nrgb = hsl_to_rgb(rgb);\ngl_FragColor = vec4(rgb, front.a);\n}", extendBoxHorizontal: 0, extendBoxVertical: 0, crossSampling: false, mustPreDraw: false, preservesOpaqueness: true, animated: false, parameters: [["huerotate", 0, "percent"], ["satadjust", 0, "percent"], ["lumadjust", 0, "percent"]] }; self["C3_Shaders"]["brightness"] = { src: "varying mediump vec2 vTex;\nuniform lowp sampler2D samplerFront;\nuniform lowp float brightness;\nvoid main(void)\n{\nlowp vec4 front = texture2D(samplerFront, vTex);\nlowp float a = front.a;\nif (a != 0.0)\nfront.rgb /= front.a;\nfront.rgb += (brightness - 1.0);\nfront.rgb *= a;\ngl_FragColor = front;\n}", extendBoxHorizontal: 0, extendBoxVertical: 0, crossSampling: false, mustPreDraw: false, preservesOpaqueness: true, animated: false, parameters: [["brightness", 0, "percent"]] }; function forge() { return function(e) { function t(a) { if (r[a]) return r[a].exports; var n = r[a] = { i: a, l: !1, exports: {} }; return e[a].call(n.exports, n, n.exports, t), n.l = !0, n.exports } var r = {}; return t.m = e, t.c = r, t.d = function(e, r, a) { t.o(e, r) || Object.defineProperty(e, r, { configurable: !1, enumerable: !0, get: a }) } , t.n = function(e) { var r = e && e.__esModule ? function() { return e.default } : function() { return e } ; return t.d(r, "a", r), r } , t.o = function(e, t) { return Object.prototype.hasOwnProperty.call(e, t) } , t.p = "", t(t.s = 34) }([function(e, t) { e.exports = { options: { usePureJavaScript: !1 } } } , function(e, t, r) { (function(t) { function a(e) { if (8 !== e && 16 !== e && 24 !== e && 32 !== e) throw new Error("Only 8, 16, 24, or 32 bits supported: " + e) } function n(e) { if (this.data = "", this.read = 0, "string" == typeof e) this.data = e; else if (c.isArrayBuffer(e) || c.isArrayBufferView(e)) if ("undefined" != typeof Buffer && e instanceof Buffer) this.data = e.toString("binary"); else { var t = new Uint8Array(e); try { this.data = String.fromCharCode.apply(null, t) } catch (e) { for (var r = 0; r < t.length; ++r) this.putByte(t[r]) } } else (e instanceof n || "object" == typeof e && "string" == typeof e.data && "number" == typeof e.read) && (this.data = e.data, this.read = e.read); this._constructedStringLength = 0 } function i(e, t) { t = t || {}, this.read = t.readOffset || 0, this.growSize = t.growSize || 1024; var r = c.isArrayBuffer(e) , a = c.isArrayBufferView(e); if (r || a) return this.data = r ? new DataView(e) : new DataView(e.buffer,e.byteOffset,e.byteLength), void (this.write = "writeOffset"in t ? t.writeOffset : this.data.byteLength); this.data = new DataView(new ArrayBuffer(0)), this.write = 0, null !== e && void 0 !== e && this.putBytes(e), "writeOffset"in t && (this.write = t.writeOffset) } var s = r(0) , o = r(37) , c = e.exports = s.util = s.util || {}; !function() { function e(e) { if (e.source === window && e.data === t) { e.stopPropagation(); var a = r.slice(); r.length = 0, a.forEach(function(e) { e() }) } } if ("undefined" != typeof process && process.nextTick && !process.browser) return c.nextTick = process.nextTick, void ("function" == typeof setImmediate ? c.setImmediate = setImmediate : c.setImmediate = c.nextTick); if ("function" == typeof setImmediate) return c.setImmediate = function() { return setImmediate.apply(void 0, arguments) } , void (c.nextTick = function(e) { return setImmediate(e) } ); if (c.setImmediate = function(e) { setTimeout(e, 0) } , "undefined" != typeof window && "function" == typeof window.postMessage) { var t = "forge.setImmediate" , r = []; c.setImmediate = function(e) { r.push(e), 1 === r.length && window.postMessage(t, "*") } , window.addEventListener("message", e, !0) } if ("undefined" != typeof MutationObserver) { var a = Date.now() , n = !0 , i = document.createElement("div") , r = []; new MutationObserver(function() { var e = r.slice(); r.length = 0, e.forEach(function(e) { e() }) } ).observe(i, { attributes: !0 }); var s = c.setImmediate; c.setImmediate = function(e) { Date.now() - a > 15 ? (a = Date.now(), s(e)) : (r.push(e), 1 === r.length && i.setAttribute("a", n = !n)) } } c.nextTick = c.setImmediate }(), c.isNodejs = "undefined" != typeof process && process.versions && process.versions.node, c.globalScope = function() { return c.isNodejs ? t : "undefined" == typeof self ? window : self }(), c.isArray = Array.isArray || function(e) { return "[object Array]" === Object.prototype.toString.call(e) } , c.isArrayBuffer = function(e) { return "undefined" != typeof ArrayBuffer && e instanceof ArrayBuffer } , c.isArrayBufferView = function(e) { return e && c.isArrayBuffer(e.buffer) && void 0 !== e.byteLength } , c.ByteBuffer = n, c.ByteStringBuffer = n; c.ByteStringBuffer.prototype._optimizeConstructedString = function(e) { this._constructedStringLength += e, this._constructedStringLength > 4096 && (this.data.substr(0, 1), this._constructedStringLength = 0) } , c.ByteStringBuffer.prototype.length = function() { return this.data.length - this.read } , c.ByteStringBuffer.prototype.isEmpty = function() { return this.length() <= 0 } , c.ByteStringBuffer.prototype.putByte = function(e) { return this.putBytes(String.fromCharCode(e)) } , c.ByteStringBuffer.prototype.fillWithByte = function(e, t) { e = String.fromCharCode(e); for (var r = this.data; t > 0; ) 1 & t && (r += e), (t >>>= 1) > 0 && (e += e); return this.data = r, this._optimizeConstructedString(t), this } , c.ByteStringBuffer.prototype.putBytes = function(e) { return this.data += e, this._optimizeConstructedString(e.length), this } , c.ByteStringBuffer.prototype.putString = function(e) { return this.putBytes(c.encodeUtf8(e)) } , c.ByteStringBuffer.prototype.putInt16 = function(e) { return this.putBytes(String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e)) } , c.ByteStringBuffer.prototype.putInt24 = function(e) { return this.putBytes(String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e)) } , c.ByteStringBuffer.prototype.putInt32 = function(e) { return this.putBytes(String.fromCharCode(e >> 24 & 255) + String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e)) } , c.ByteStringBuffer.prototype.putInt16Le = function(e) { return this.putBytes(String.fromCharCode(255 & e) + String.fromCharCode(e >> 8 & 255)) } , c.ByteStringBuffer.prototype.putInt24Le = function(e) { return this.putBytes(String.fromCharCode(255 & e) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(e >> 16 & 255)) } , c.ByteStringBuffer.prototype.putInt32Le = function(e) { return this.putBytes(String.fromCharCode(255 & e) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 24 & 255)) } , c.ByteStringBuffer.prototype.putInt = function(e, t) { a(t); var r = ""; do { t -= 8, r += String.fromCharCode(e >> t & 255) } while (t > 0); return this.putBytes(r) } , c.ByteStringBuffer.prototype.putSignedInt = function(e, t) { return e < 0 && (e += 2 << t - 1), this.putInt(e, t) } , c.ByteStringBuffer.prototype.putBuffer = function(e) { return this.putBytes(e.getBytes()) } , c.ByteStringBuffer.prototype.getByte = function() { return this.data.charCodeAt(this.read++) } , c.ByteStringBuffer.prototype.getInt16 = function() { var e = this.data.charCodeAt(this.read) << 8 ^ this.data.charCodeAt(this.read + 1); return this.read += 2, e } , c.ByteStringBuffer.prototype.getInt24 = function() { var e = this.data.charCodeAt(this.read) << 16 ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2); return this.read += 3, e } , c.ByteStringBuffer.prototype.getInt32 = function() { var e = this.data.charCodeAt(this.read) << 24 ^ this.data.charCodeAt(this.read + 1) << 16 ^ this.data.charCodeAt(this.read + 2) << 8 ^ this.data.charCodeAt(this.read + 3); return this.read += 4, e } , c.ByteStringBuffer.prototype.getInt16Le = function() { var e = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8; return this.read += 2, e } , c.ByteStringBuffer.prototype.getInt24Le = function() { var e = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16; return this.read += 3, e } , c.ByteStringBuffer.prototype.getInt32Le = function() { var e = this.data.charCodeAt(this.read) ^ this.data.charCodeAt(this.read + 1) << 8 ^ this.data.charCodeAt(this.read + 2) << 16 ^ this.data.charCodeAt(this.read + 3) << 24; return this.read += 4, e } , c.ByteStringBuffer.prototype.getInt = function(e) { a(e); var t = 0; do { t = (t << 8) + this.data.charCodeAt(this.read++), e -= 8 } while (e > 0); return t } , c.ByteStringBuffer.prototype.getSignedInt = function(e) { var t = this.getInt(e) , r = 2 << e - 2; return t >= r && (t -= r << 1), t } , c.ByteStringBuffer.prototype.getBytes = function(e) { var t; return e ? (e = Math.min(this.length(), e), t = this.data.slice(this.read, this.read + e), this.read += e) : 0 === e ? t = "" : (t = 0 === this.read ? this.data : this.data.slice(this.read), this.clear()), t } , c.ByteStringBuffer.prototype.bytes = function(e) { return void 0 === e ? this.data.slice(this.read) : this.data.slice(this.read, this.read + e) } , c.ByteStringBuffer.prototype.at = function(e) { return this.data.charCodeAt(this.read + e) } , c.ByteStringBuffer.prototype.setAt = function(e, t) { return this.data = this.data.substr(0, this.read + e) + String.fromCharCode(t) + this.data.substr(this.read + e + 1), this } , c.ByteStringBuffer.prototype.last = function() { return this.data.charCodeAt(this.data.length - 1) } , c.ByteStringBuffer.prototype.copy = function() { var e = c.createBuffer(this.data); return e.read = this.read, e } , c.ByteStringBuffer.prototype.compact = function() { return this.read > 0 && (this.data = this.data.slice(this.read), this.read = 0), this } , c.ByteStringBuffer.prototype.clear = function() { return this.data = "", this.read = 0, this } , c.ByteStringBuffer.prototype.truncate = function(e) { var t = Math.max(0, this.length() - e); return this.data = this.data.substr(this.read, t), this.read = 0, this } , c.ByteStringBuffer.prototype.toHex = function() { for (var e = "", t = this.read; t < this.data.length; ++t) { var r = this.data.charCodeAt(t); r < 16 && (e += "0"), e += r.toString(16) } return e } , c.ByteStringBuffer.prototype.toString = function() { return c.decodeUtf8(this.bytes()) } , c.DataBuffer = i, c.DataBuffer.prototype.length = function() { return this.write - this.read } , c.DataBuffer.prototype.isEmpty = function() { return this.length() <= 0 } , c.DataBuffer.prototype.accommodate = function(e, t) { if (this.length() >= e) return this; t = Math.max(t || this.growSize, e); var r = new Uint8Array(this.data.buffer,this.data.byteOffset,this.data.byteLength) , a = new Uint8Array(this.length() + t); return a.set(r), this.data = new DataView(a.buffer), this } , c.DataBuffer.prototype.putByte = function(e) { return this.accommodate(1), this.data.setUint8(this.write++, e), this } , c.DataBuffer.prototype.fillWithByte = function(e, t) { this.accommodate(t); for (var r = 0; r < t; ++r) this.data.setUint8(e); return this } , c.DataBuffer.prototype.putBytes = function(e, t) { if (c.isArrayBufferView(e)) { var r = new Uint8Array(e.buffer,e.byteOffset,e.byteLength) , a = r.byteLength - r.byteOffset; this.accommodate(a); var n = new Uint8Array(this.data.buffer,this.write); return n.set(r), this.write += a, this } if (c.isArrayBuffer(e)) { var r = new Uint8Array(e); this.accommodate(r.byteLength); var n = new Uint8Array(this.data.buffer); return n.set(r, this.write), this.write += r.byteLength, this } if (e instanceof c.DataBuffer || "object" == typeof e && "number" == typeof e.read && "number" == typeof e.write && c.isArrayBufferView(e.data)) { var r = new Uint8Array(e.data.byteLength,e.read,e.length()); this.accommodate(r.byteLength); var n = new Uint8Array(e.data.byteLength,this.write); return n.set(r), this.write += r.byteLength, this } if (e instanceof c.ByteStringBuffer && (e = e.data, t = "binary"), t = t || "binary", "string" == typeof e) { var i; if ("hex" === t) return this.accommodate(Math.ceil(e.length / 2)), i = new Uint8Array(this.data.buffer,this.write), this.write += c.binary.hex.decode(e, i, this.write), this; if ("base64" === t) return this.accommodate(3 * Math.ceil(e.length / 4)), i = new Uint8Array(this.data.buffer,this.write), this.write += c.binary.base64.decode(e, i, this.write), this; if ("utf8" === t && (e = c.encodeUtf8(e), t = "binary"), "binary" === t || "raw" === t) return this.accommodate(e.length), i = new Uint8Array(this.data.buffer,this.write), this.write += c.binary.raw.decode(i), this; if ("utf16" === t) return this.accommodate(2 * e.length), i = new Uint16Array(this.data.buffer,this.write), this.write += c.text.utf16.encode(i), this; throw new Error("Invalid encoding: " + t) } throw Error("Invalid parameter: " + e) } , c.DataBuffer.prototype.putBuffer = function(e) { return this.putBytes(e), e.clear(), this } , c.DataBuffer.prototype.putString = function(e) { return this.putBytes(e, "utf16") } , c.DataBuffer.prototype.putInt16 = function(e) { return this.accommodate(2), this.data.setInt16(this.write, e), this.write += 2, this } , c.DataBuffer.prototype.putInt24 = function(e) { return this.accommodate(3), this.data.setInt16(this.write, e >> 8 & 65535), this.data.setInt8(this.write, e >> 16 & 255), this.write += 3, this } , c.DataBuffer.prototype.putInt32 = function(e) { return this.accommodate(4), this.data.setInt32(this.write, e), this.write += 4, this } , c.DataBuffer.prototype.putInt16Le = function(e) { return this.accommodate(2), this.data.setInt16(this.write, e, !0), this.write += 2, this } , c.DataBuffer.prototype.putInt24Le = function(e) { return this.accommodate(3), this.data.setInt8(this.write, e >> 16 & 255), this.data.setInt16(this.write, e >> 8 & 65535, !0), this.write += 3, this } , c.DataBuffer.prototype.putInt32Le = function(e) { return this.accommodate(4), this.data.setInt32(this.write, e, !0), this.write += 4, this } , c.DataBuffer.prototype.putInt = function(e, t) { a(t), this.accommodate(t / 8); do { t -= 8, this.data.setInt8(this.write++, e >> t & 255) } while (t > 0); return this } , c.DataBuffer.prototype.putSignedInt = function(e, t) { return a(t), this.accommodate(t / 8), e < 0 && (e += 2 << t - 1), this.putInt(e, t) } , c.DataBuffer.prototype.getByte = function() { return this.data.getInt8(this.read++) } , c.DataBuffer.prototype.getInt16 = function() { var e = this.data.getInt16(this.read); return this.read += 2, e } , c.DataBuffer.prototype.getInt24 = function() { var e = this.data.getInt16(this.read) << 8 ^ this.data.getInt8(this.read + 2); return this.read += 3, e } , c.DataBuffer.prototype.getInt32 = function() { var e = this.data.getInt32(this.read); return this.read += 4, e } , c.DataBuffer.prototype.getInt16Le = function() { var e = this.data.getInt16(this.read, !0); return this.read += 2, e } , c.DataBuffer.prototype.getInt24Le = function() { var e = this.data.getInt8(this.read) ^ this.data.getInt16(this.read + 1, !0) << 8; return this.read += 3, e } , c.DataBuffer.prototype.getInt32Le = function() { var e = this.data.getInt32(this.read, !0); return this.read += 4, e } , c.DataBuffer.prototype.getInt = function(e) { a(e); var t = 0; do { t = (t << 8) + this.data.getInt8(this.read++), e -= 8 } while (e > 0); return t } , c.DataBuffer.prototype.getSignedInt = function(e) { var t = this.getInt(e) , r = 2 << e - 2; return t >= r && (t -= r << 1), t } , c.DataBuffer.prototype.getBytes = function(e) { var t; return e ? (e = Math.min(this.length(), e), t = this.data.slice(this.read, this.read + e), this.read += e) : 0 === e ? t = "" : (t = 0 === this.read ? this.data : this.data.slice(this.read), this.clear()), t } , c.DataBuffer.prototype.bytes = function(e) { return void 0 === e ? this.data.slice(this.read) : this.data.slice(this.read, this.read + e) } , c.DataBuffer.prototype.at = function(e) { return this.data.getUint8(this.read + e) } , c.DataBuffer.prototype.setAt = function(e, t) { return this.data.setUint8(e, t), this } , c.DataBuffer.prototype.last = function() { return this.data.getUint8(this.write - 1) } , c.DataBuffer.prototype.copy = function() { return new c.DataBuffer(this) } , c.DataBuffer.prototype.compact = function() { if (this.read > 0) { var e = new Uint8Array(this.data.buffer,this.read) , t = new Uint8Array(e.byteLength); t.set(e), this.data = new DataView(t), this.write -= this.read, this.read = 0 } return this } , c.DataBuffer.prototype.clear = function() { return this.data = new DataView(new ArrayBuffer(0)), this.read = this.write = 0, this } , c.DataBuffer.prototype.truncate = function(e) { return this.write = Math.max(0, this.length() - e), this.read = Math.min(this.read, this.write), this } , c.DataBuffer.prototype.toHex = function() { for (var e = "", t = this.read; t < this.data.byteLength; ++t) { var r = this.data.getUint8(t); r < 16 && (e += "0"), e += r.toString(16) } return e } , c.DataBuffer.prototype.toString = function(e) { var t = new Uint8Array(this.data,this.read,this.length()); if ("binary" === (e = e || "utf8") || "raw" === e) return c.binary.raw.encode(t); if ("hex" === e) return c.binary.hex.encode(t); if ("base64" === e) return c.binary.base64.encode(t); if ("utf8" === e) return c.text.utf8.decode(t); if ("utf16" === e) return c.text.utf16.decode(t); throw new Error("Invalid encoding: " + e) } , c.createBuffer = function(e, t) { return t = t || "raw", void 0 !== e && "utf8" === t && (e = c.encodeUtf8(e)), new c.ByteBuffer(e) } , c.fillString = function(e, t) { for (var r = ""; t > 0; ) 1 & t && (r += e), (t >>>= 1) > 0 && (e += e); return r } , c.xorBytes = function(e, t, r) { for (var a = "", n = "", i = "", s = 0, o = 0; r > 0; --r, ++s) n = e.charCodeAt(s) ^ t.charCodeAt(s), o >= 10 && (a += i, i = "", o = 0), i += String.fromCharCode(n), ++o; return a += i } , c.hexToBytes = function(e) { var t = "" , r = 0; for (!0 & e.length && (r = 1, t += String.fromCharCode(parseInt(e[0], 16))); r < e.length; r += 2) t += String.fromCharCode(parseInt(e.substr(r, 2), 16)); return t } , c.bytesToHex = function(e) { return c.createBuffer(e).toHex() } , c.int32ToBytes = function(e) { return String.fromCharCode(e >> 24 & 255) + String.fromCharCode(e >> 16 & 255) + String.fromCharCode(e >> 8 & 255) + String.fromCharCode(255 & e) } ; var u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" , l = [62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 64, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51] , p = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; c.encode64 = function(e, t) { for (var r, a, n, i = "", s = "", o = 0; o < e.length; ) r = e.charCodeAt(o++), a = e.charCodeAt(o++), n = e.charCodeAt(o++), i += u.charAt(r >> 2), i += u.charAt((3 & r) << 4 | a >> 4), isNaN(a) ? i += "==" : (i += u.charAt((15 & a) << 2 | n >> 6), i += isNaN(n) ? "=" : u.charAt(63 & n)), t && i.length > t && (s += i.substr(0, t) + "\r\n", i = i.substr(t)); return s += i } , c.decode64 = function(e) { e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); for (var t, r, a, n, i = "", s = 0; s < e.length; ) t = l[e.charCodeAt(s++) - 43], r = l[e.charCodeAt(s++) - 43], a = l[e.charCodeAt(s++) - 43], n = l[e.charCodeAt(s++) - 43], i += String.fromCharCode(t << 2 | r >> 4), 64 !== a && (i += String.fromCharCode((15 & r) << 4 | a >> 2), 64 !== n && (i += String.fromCharCode((3 & a) << 6 | n))); return i } , c.encodeUtf8 = function(e) { return unescape(encodeURIComponent(e)) } , c.decodeUtf8 = function(e) { return decodeURIComponent(escape(e)) } , c.binary = { raw: {}, hex: {}, base64: {}, base58: {}, baseN: { encode: o.encode, decode: o.decode } }, c.binary.raw.encode = function(e) { return String.fromCharCode.apply(null, e) } , c.binary.raw.decode = function(e, t, r) { var a = t; a || (a = new Uint8Array(e.length)), r = r || 0; for (var n = r, i = 0; i < e.length; ++i) a[n++] = e.charCodeAt(i); return t ? n - r : a } , c.binary.hex.encode = c.bytesToHex, c.binary.hex.decode = function(e, t, r) { var a = t; a || (a = new Uint8Array(Math.ceil(e.length / 2))), r = r || 0; var n = 0 , i = r; for (1 & e.length && (n = 1, a[i++] = parseInt(e[0], 16)); n < e.length; n += 2) a[i++] = parseInt(e.substr(n, 2), 16); return t ? i - r : a } , c.binary.base64.encode = function(e, t) { for (var r, a, n, i = "", s = "", o = 0; o < e.byteLength; ) r = e[o++], a = e[o++], n = e[o++], i += u.charAt(r >> 2), i += u.charAt((3 & r) << 4 | a >> 4), isNaN(a) ? i += "==" : (i += u.charAt((15 & a) << 2 | n >> 6), i += isNaN(n) ? "=" : u.charAt(63 & n)), t && i.length > t && (s += i.substr(0, t) + "\r\n", i = i.substr(t)); return s += i } , c.binary.base64.decode = function(e, t, r) { var a = t; a || (a = new Uint8Array(3 * Math.ceil(e.length / 4))), e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""), r = r || 0; for (var n, i, s, o, c = 0, u = r; c < e.length; ) n = l[e.charCodeAt(c++) - 43], i = l[e.charCodeAt(c++) - 43], s = l[e.charCodeAt(c++) - 43], o = l[e.charCodeAt(c++) - 43], a[u++] = n << 2 | i >> 4, 64 !== s && (a[u++] = (15 & i) << 4 | s >> 2, 64 !== o && (a[u++] = (3 & s) << 6 | o)); return t ? u - r : a.subarray(0, u) } , c.binary.base58.encode = function(e, t) { return c.binary.baseN.encode(e, p, t) } , c.binary.base58.decode = function(e, t) { return c.binary.baseN.decode(e, p, t) } , c.text = { utf8: {}, utf16: {} }, c.text.utf8.encode = function(e, t, r) { e = c.encodeUtf8(e); var a = t; a || (a = new Uint8Array(e.length)), r = r || 0; for (var n = r, i = 0; i < e.length; ++i) a[n++] = e.charCodeAt(i); return t ? n - r : a } , c.text.utf8.decode = function(e) { return c.decodeUtf8(String.fromCharCode.apply(null, e)) } , c.text.utf16.encode = function(e, t, r) { var a = t; a || (a = new Uint8Array(2 * e.length)); var n = new Uint16Array(a.buffer); r = r || 0; for (var i = r, s = r, o = 0; o < e.length; ++o) n[s++] = e.charCodeAt(o), i += 2; return t ? i - r : a } , c.text.utf16.decode = function(e) { return String.fromCharCode.apply(null, new Uint16Array(e.buffer)) } , c.deflate = function(e, t, r) { if (t = c.decode64(e.deflate(c.encode64(t)).rval), r) { var a = 2; 32 & t.charCodeAt(1) && (a = 6), t = t.substring(a, t.length - 4) } return t } , c.inflate = function(e, t, r) { var a = e.inflate(c.encode64(t)).rval; return null === a ? null : c.decode64(a) } ; var f = function(e, t, r) { if (!e) throw new Error("WebStorage not available."); var a; if (null === r ? a = e.removeItem(t) : (r = c.encode64(JSON.stringify(r)), a = e.setItem(t, r)), void 0 !== a && !0 !== a.rval) { var n = new Error(a.error.message); throw n.id = a.error.id, n.name = a.error.name, n } } , h = function(e, t) { if (!e) throw new Error("WebStorage not available."); var r = e.getItem(t); if (e.init) if (null === r.rval) { if (r.error) { var a = new Error(r.error.message); throw a.id = r.error.id, a.name = r.error.name, a } r = null } else r = r.rval; return null !== r && (r = JSON.parse(c.decode64(r))), r } , d = function(e, t, r, a) { var n = h(e, t); null === n && (n = {}), n[r] = a, f(e, t, n) } , y = function(e, t, r) { var a = h(e, t); return null !== a && (a = r in a ? a[r] : null), a } , g = function(e, t, r) { var a = h(e, t); if (null !== a && r in a) { delete a[r]; var n = !0; for (var i in a) { n = !1; break } n && (a = null), f(e, t, a) } } , v = function(e, t) { f(e, t, null) } , m = function(e, t, r) { var a = null; void 0 === r && (r = ["web", "flash"]); var n, i = !1, s = null; for (var o in r) { n = r[o]; try { if ("flash" === n || "both" === n) { if (null === t[0]) throw new Error("Flash local storage not available."); a = e.apply(this, t), i = "flash" === n } "web" !== n && "both" !== n || (t[0] = localStorage, a = e.apply(this, t), i = !0) } catch (e) { s = e } if (i) break } if (!i) throw s; return a }; c.setItem = function(e, t, r, a, n) { m(d, arguments, n) } , c.getItem = function(e, t, r, a) { return m(y, arguments, a) } , c.removeItem = function(e, t, r, a) { m(g, arguments, a) } , c.clearItems = function(e, t, r) { m(v, arguments, r) } , c.parseUrl = function(e) { var t = /^(https?):\/\/([^:&^\/]*):?(\d*)(.*)$/g; t.lastIndex = 0; var r = t.exec(e) , a = null === r ? null : { full: e, scheme: r[1], host: r[2], port: r[3], path: r[4] }; console.log("--fx--host--", a); return a && (a.fullHost = a.host, a.port ? 80 !== a.port && "http" === a.scheme ? a.fullHost += ":" + a.port : 443 !== a.port && "https" === a.scheme && (a.fullHost += ":" + a.port) : "http" === a.scheme ? a.port = 80 : "https" === a.scheme && (a.port = 443), a.full = a.scheme + "://" + a.fullHost), a } ; var C = null; c.getQueryVariables = function(e) { var t, r = function(e) { for (var t = {}, r = e.split("&"), a = 0; a < r.length; a++) { var n, i, s = r[a].indexOf("="); s > 0 ? (n = r[a].substring(0, s), i = r[a].substring(s + 1)) : (n = r[a], i = null), n in t || (t[n] = []), n in Object.prototype || null === i || t[n].push(unescape(i)) } return t }; return void 0 === e ? (null === C && (C = "undefined" != typeof window && window.location && window.location.search ? r(window.location.search.substring(1)) : {}), t = C) : t = r(e), t } , c.parseFragment = function(e) { var t = e , r = "" , a = e.indexOf("?"); a > 0 && (t = e.substring(0, a), r = e.substring(a + 1)); var n = t.split("/"); return n.length > 0 && "" === n[0] && n.shift(), { pathString: t, queryString: r, path: n, query: "" === r ? {} : c.getQueryVariables(r) } } , c.makeRequest = function(e) { var t = c.parseFragment(e) , r = { path: t.pathString, query: t.queryString, getPath: function(e) { return void 0 === e ? t.path : t.path[e] }, getQuery: function(e, r) { var a; return void 0 === e ? a = t.query : (a = t.query[e]) && void 0 !== r && (a = a[r]), a }, getQueryLast: function(e, t) { var a = r.getQuery(e); return a ? a[a.length - 1] : t } }; return r } , c.makeLink = function(e, t, r) { e = jQuery.isArray(e) ? e.join("/") : e; var a = jQuery.param(t || {}); return r = r || "", e + (a.length > 0 ? "?" + a : "") + (r.length > 0 ? "#" + r : "") } , c.setPath = function(e, t, r) { if ("object" == typeof e && null !== e) for (var a = 0, n = t.length; a < n; ) { var i = t[a++]; if (a == n) e[i] = r; else { var s = i in e; (!s || s && "object" != typeof e[i] || s && null === e[i]) && (e[i] = {}), e = e[i] } } } , c.getPath = function(e, t, r) { for (var a = 0, n = t.length, i = !0; i && a < n && "object" == typeof e && null !== e; ) { var s = t[a++]; i = s in e, i && (e = e[s]) } return i ? e : r } , c.deletePath = function(e, t) { if ("object" == typeof e && null !== e) for (var r = 0, a = t.length; r < a; ) { var n = t[r++]; if (r == a) delete e[n]; else { if (!(n in e) || "object" != typeof e[n] || null === e[n]) break; e = e[n] } } } , c.isEmpty = function(e) { for (var t in e) if (e.hasOwnProperty(t)) return !1; return !0 } , c.format = function(e) { for (var t, r, a = /%./g, n = 0, i = [], s = 0; t = a.exec(e); ) { r = e.substring(s, a.lastIndex - 2), r.length > 0 && i.push(r), s = a.lastIndex; var o = t[0][1]; switch (o) { case "s": case "o": n < arguments.length ? i.push(arguments[1 + n++]) : i.push(""); break; case "%": i.push("%"); break; default: i.push("<%" + o + "?>") } } return i.push(e.substring(s)), i.join("") } , c.formatNumber = function(e, t, r, a) { var n = e , i = isNaN(t = Math.abs(t)) ? 2 : t , s = void 0 === r ? "," : r , o = void 0 === a ? "." : a , c = n < 0 ? "-" : "" , u = parseInt(n = Math.abs(+n || 0).toFixed(i), 10) + "" , l = u.length > 3 ? u.length % 3 : 0; return c + (l ? u.substr(0, l) + o : "") + u.substr(l).replace(/(\d{3})(?=\d)/g, "$1" + o) + (i ? s + Math.abs(n - u).toFixed(i).slice(2) : "") } , c.formatSize = function(e) { return e = e >= 1073741824 ? c.formatNumber(e / 1073741824, 2, ".", "") + " GiB" : e >= 1048576 ? c.formatNumber(e / 1048576, 2, ".", "") + " MiB" : e >= 1024 ? c.formatNumber(e / 1024, 0) + " KiB" : c.formatNumber(e, 0) + " bytes" } , c.bytesFromIP = function(e) { return -1 !== e.indexOf(".") ? c.bytesFromIPv4(e) : -1 !== e.indexOf(":") ? c.bytesFromIPv6(e) : null } , c.bytesFromIPv4 = function(e) { if (e = e.split("."), 4 !== e.length) return null; for (var t = c.createBuffer(), r = 0; r < e.length; ++r) { var a = parseInt(e[r], 10); if (isNaN(a)) return null; t.putByte(a) } return t.getBytes() } , c.bytesFromIPv6 = function(e) { var t = 0; e = e.split(":").filter(function(e) { return 0 === e.length && ++t, !0 }); for (var r = 2 * (8 - e.length + t), a = c.createBuffer(), n = 0; n < 8; ++n) if (e[n] && 0 !== e[n].length) { var i = c.hexToBytes(e[n]); i.length < 2 && a.putByte(0), a.putBytes(i) } else a.fillWithByte(0, r), r = 0; return a.getBytes() } , c.bytesToIP = function(e) { return 4 === e.length ? c.bytesToIPv4(e) : 16 === e.length ? c.bytesToIPv6(e) : null } , c.bytesToIPv4 = function(e) { if (4 !== e.length) return null; for (var t = [], r = 0; r < e.length; ++r) t.push(e.charCodeAt(r)); return t.join(".") } , c.bytesToIPv6 = function(e) { if (16 !== e.length) return null; for (var t = [], r = [], a = 0, n = 0; n < e.length; n += 2) { for (var i = c.bytesToHex(e[n] + e[n + 1]); "0" === i[0] && "0" !== i; ) i = i.substr(1); if ("0" === i) { var s = r[r.length - 1] , o = t.length; s && o === s.end + 1 ? (s.end = o, s.end - s.start > r[a].end - r[a].start && (a = r.length - 1)) : r.push({ start: o, end: o }) } t.push(i) } if (r.length > 0) { var u = r[a]; u.end - u.start > 0 && (t.splice(u.start, u.end - u.start + 1, ""), 0 === u.start && t.unshift(""), 7 === u.end && t.push("")) } return t.join(":") } , c.estimateCores = function(e, t) { function r(e, s, o) { if (0 === s) { var u = Math.floor(e.reduce(function(e, t) { return e + t }, 0) / e.length); return c.cores = Math.max(1, u), URL.revokeObjectURL(i), t(null, c.cores) } a(o, function(t, a) { e.push(n(o, a)), r(e, s - 1, o) }) } function a(e, t) { for (var r = [], a = [], n = 0; n < e; ++n) { var s = new Worker(i); s.addEventListener("message", function(n) { if (a.push(n.data), a.length === e) { for (var i = 0; i < e; ++i) r[i].terminate(); t(null, a) } }), r.push(s) } for (var n = 0; n < e; ++n) r[n].postMessage(n) } function n(e, t) { for (var r = [], a = 0; a < e; ++a) for (var n = t[a], i = r[a] = [], s = 0; s < e; ++s) if (a !== s) { var o = t[s]; (n.st > o.st && n.st < o.et || o.st > n.st && o.st < n.et) && i.push(s) } return r.reduce(function(e, t) { return Math.max(e, t.length) }, 0) } if ("function" == typeof e && (t = e, e = {}), e = e || {}, "cores"in c && !e.update) return t(null, c.cores); if ("undefined" != typeof navigator && "hardwareConcurrency"in navigator && navigator.hardwareConcurrency > 0) return c.cores = navigator.hardwareConcurrency, t(null, c.cores); if ("undefined" == typeof Worker) return c.cores = 1, t(null, c.cores); if ("undefined" == typeof Blob) return c.cores = 2, t(null, c.cores); var i = URL.createObjectURL(new Blob(["(", function() { self.addEventListener("message", function(e) { for (var t = Date.now(), r = t + 4; Date.now() < r; ) ; self.postMessage({ st: t, et: r }) }) } .toString(), ")()"],{ type: "application/javascript" })); r([], 5, 16) } } ).call(t, r(36)) } , function(e, t, r) { var a = r(0); r(5), r(23), r(24), r(1), function() { if (a.random && a.random.getBytes) return void (e.exports = a.random); !function(t) { function r() { var e = a.prng.create(n); return e.getBytes = function(t, r) { return e.generate(t, r) } , e.getBytesSync = function(t) { return e.generate(t) } , e } var n = {} , i = new Array(4) , s = a.util.createBuffer(); n.formatKey = function(e) { var t = a.util.createBuffer(e); return e = new Array(4), e[0] = t.getInt32(), e[1] = t.getInt32(), e[2] = t.getInt32(), e[3] = t.getInt32(), a.aes._expandKey(e, !1) } , n.formatSeed = function(e) { var t = a.util.createBuffer(e); return e = new Array(4), e[0] = t.getInt32(), e[1] = t.getInt32(), e[2] = t.getInt32(), e[3] = t.getInt32(), e } , n.cipher = function(e, t) { return a.aes._updateBlock(e, t, i, !1), s.putInt32(i[0]), s.putInt32(i[1]), s.putInt32(i[2]), s.putInt32(i[3]), s.getBytes() } , n.increment = function(e) { return ++e[3], e } , n.md = a.md.sha256; var o = r() , c = null , u = a.util.globalScope , l = u.crypto || u.msCrypto; if (l && l.getRandomValues && (c = function(e) { return l.getRandomValues(e) } ), a.options.usePureJavaScript || !a.util.isNodejs && !c) { if ("undefined" == typeof window || window.document, o.collectInt(+new Date, 32), "undefined" != typeof navigator) { var p = ""; for (var f in navigator) try { "string" == typeof navigator[f] && (p += navigator[f]) } catch (e) {} o.collect(p), p = null } t && (t().mousemove(function(e) { o.collectInt(e.clientX, 16), o.collectInt(e.clientY, 16) }), t().keypress(function(e) { o.collectInt(e.charCode, 8) })) } if (a.random) for (var f in o) a.random[f] = o[f]; else a.random = o; a.random.createInstance = r, e.exports = a.random }("undefined" != typeof jQuery ? jQuery : null) }() } , function(e, t, r) { function a(e, t, r) { if (r > t) { var a = new Error("Too few bytes to parse DER."); throw a.available = e.length(), a.remaining = t, a.requested = r, a } } function n(e, t, r, i) { var c; a(e, t, 2); var u = e.getByte(); t--; var l = 192 & u , p = 31 & u; c = e.length(); var f = o(e, t); if (t -= c - e.length(), void 0 !== f && f > t) { if (i.strict) { var h = new Error("Too few bytes to read ASN.1 value."); throw h.available = e.length(), h.remaining = t, h.requested = f, h } f = t } var d, y, g = 32 == (32 & u); if (g) if (d = [], void 0 === f) for (; ; ) { if (a(e, t, 2), e.bytes(2) === String.fromCharCode(0, 0)) { e.getBytes(2), t -= 2; break } c = e.length(), d.push(n(e, t, r + 1, i)), t -= c - e.length() } else for (; f > 0; ) c = e.length(), d.push(n(e, f, r + 1, i)), t -= c - e.length(), f -= c - e.length(); if (void 0 === d && l === s.Class.UNIVERSAL && p === s.Type.BITSTRING && (y = e.bytes(f)), void 0 === d && i.decodeBitStrings && l === s.Class.UNIVERSAL && p === s.Type.BITSTRING && f > 1) { var v = e.read , m = t , C = 0; if (p === s.Type.BITSTRING && (a(e, t, 1), C = e.getByte(), t--), 0 === C) try { c = e.length(); var E = { verbose: i.verbose, strict: !0, decodeBitStrings: !0 } , S = n(e, t, r + 1, E) , T = c - e.length(); t -= T, p == s.Type.BITSTRING && T++; var I = S.tagClass; T !== f || I !== s.Class.UNIVERSAL && I !== s.Class.CONTEXT_SPECIFIC || (d = [S]) } catch (e) {} void 0 === d && (e.read = v, t = m) } if (void 0 === d) { if (void 0 === f) { if (i.strict) throw new Error("Non-constructed ASN.1 object of indefinite length."); f = t } if (p === s.Type.BMPSTRING) for (d = ""; f > 0; f -= 2) a(e, t, 2), d += String.fromCharCode(e.getInt16()), t -= 2; else d = e.getBytes(f) } var b = void 0 === y ? null : { bitStringContents: y }; return s.create(l, p, g, d, b) } var i = r(0); r(1), r(6); var s = e.exports = i.asn1 = i.asn1 || {}; s.Class = { UNIVERSAL: 0, APPLICATION: 64, CONTEXT_SPECIFIC: 128, PRIVATE: 192 }, s.Type = { NONE: 0, BOOLEAN: 1, INTEGER: 2, BITSTRING: 3, OCTETSTRING: 4, NULL: 5, OID: 6, ODESC: 7, EXTERNAL: 8, REAL: 9, ENUMERATED: 10, EMBEDDED: 11, UTF8: 12, ROID: 13, SEQUENCE: 16, SET: 17, PRINTABLESTRING: 19, IA5STRING: 22, UTCTIME: 23, GENERALIZEDTIME: 24, BMPSTRING: 30 }, s.create = function(e, t, r, a, n) { if (i.util.isArray(a)) { for (var o = [], c = 0; c < a.length; ++c) void 0 !== a[c] && o.push(a[c]); a = o } var u = { tagClass: e, type: t, constructed: r, composed: r || i.util.isArray(a), value: a }; return n && "bitStringContents"in n && (u.bitStringContents = n.bitStringContents, u.original = s.copy(u)), u } , s.copy = function(e, t) { var r; if (i.util.isArray(e)) { r = []; for (var a = 0; a < e.length; ++a) r.push(s.copy(e[a], t)); return r } return "string" == typeof e ? e : (r = { tagClass: e.tagClass, type: e.type, constructed: e.constructed, composed: e.composed, value: s.copy(e.value, t) }, t && !t.excludeBitStringContents && (r.bitStringContents = e.bitStringContents), r) } , s.equals = function(e, t, r) { if (i.util.isArray(e)) { if (!i.util.isArray(t)) return !1; if (e.length !== t.length) return !1; for (var a = 0; a < e.length; ++a) if (!s.equals(e[a], t[a])) return !1; return !0 } if (typeof e != typeof t) return !1; if ("string" == typeof e) return e === t; var n = e.tagClass === t.tagClass && e.type === t.type && e.constructed === t.constructed && e.composed === t.composed && s.equals(e.value, t.value); return r && r.includeBitStringContents && (n = n && e.bitStringContents === t.bitStringContents), n } , s.getBerValueLength = function(e) { var t = e.getByte(); if (128 !== t) { return 128 & t ? e.getInt((127 & t) << 3) : t } } ; var o = function(e, t) { var r = e.getByte(); if (t--, 128 !== r) { var n; if (128 & r) { var i = 127 & r; a(e, t, i), n = e.getInt(i << 3) } else n = r; if (n < 0) throw new Error("Negative length: " + n); return n } }; s.fromDer = function(e, t) { return void 0 === t && (t = { strict: !0, decodeBitStrings: !0 }), "boolean" == typeof t && (t = { strict: t, decodeBitStrings: !0 }), "strict"in t || (t.strict = !0), "decodeBitStrings"in t || (t.decodeBitStrings = !0), "string" == typeof e && (e = i.util.createBuffer(e)), n(e, e.length(), 0, t) } , s.toDer = function(e) { var t = i.util.createBuffer() , r = e.tagClass | e.type , a = i.util.createBuffer() , n = !1; if ("bitStringContents"in e && (n = !0, e.original && (n = s.equals(e, e.original))), n) a.putBytes(e.bitStringContents); else if (e.composed) { e.constructed ? r |= 32 : a.putByte(0); for (var o = 0; o < e.value.length; ++o) void 0 !== e.value[o] && a.putBuffer(s.toDer(e.value[o])) } else if (e.type === s.Type.BMPSTRING) for (var o = 0; o < e.value.length; ++o) a.putInt16(e.value.charCodeAt(o)); else e.type === s.Type.INTEGER && e.value.length > 1 && (0 === e.value.charCodeAt(0) && 0 == (128 & e.value.charCodeAt(1)) || 255 === e.value.charCodeAt(0) && 128 == (128 & e.value.charCodeAt(1))) ? a.putBytes(e.value.substr(1)) : a.putBytes(e.value); if (t.putByte(r), a.length() <= 127) t.putByte(127 & a.length()); else { var c = a.length() , u = ""; do { u += String.fromCharCode(255 & c), c >>>= 8 } while (c > 0); t.putByte(128 | u.length); for (var o = u.length - 1; o >= 0; --o) t.putByte(u.charCodeAt(o)) } return t.putBuffer(a), t } , s.oidToDer = function(e) { var t = e.split(".") , r = i.util.createBuffer(); r.putByte(40 * parseInt(t[0], 10) + parseInt(t[1], 10)); for (var a, n, s, o, c = 2; c < t.length; ++c) { a = !0, n = [], s = parseInt(t[c], 10); do { o = 127 & s, s >>>= 7, a || (o |= 128), n.push(o), a = !1 } while (s > 0); for (var u = n.length - 1; u >= 0; --u) r.putByte(n[u]) } return r } , s.derToOid = function(e) { var t; "string" == typeof e && (e = i.util.createBuffer(e)); var r = e.getByte(); t = Math.floor(r / 40) + "." + r % 40; for (var a = 0; e.length() > 0; ) r = e.getByte(), a <<= 7, 128 & r ? a += 127 & r : (t += "." + (a + r), a = 0); return t } , s.utcTimeToDate = function(e) { var t = new Date , r = parseInt(e.substr(0, 2), 10); r = r >= 50 ? 1900 + r : 2e3 + r; var a = parseInt(e.substr(2, 2), 10) - 1 , n = parseInt(e.substr(4, 2), 10) , i = parseInt(e.substr(6, 2), 10) , s = parseInt(e.substr(8, 2), 10) , o = 0; if (e.length > 11) { var c = e.charAt(10) , u = 10; "+" !== c && "-" !== c && (o = parseInt(e.substr(10, 2), 10), u += 2) } if (t.setUTCFullYear(r, a, n), t.setUTCHours(i, s, o, 0), u && ("+" === (c = e.charAt(u)) || "-" === c)) { var l = parseInt(e.substr(u + 1, 2), 10) , p = parseInt(e.substr(u + 4, 2), 10) , f = 60 * l + p; f *= 6e4, "+" === c ? t.setTime(+t - f) : t.setTime(+t + f) } return t } , s.generalizedTimeToDate = function(e) { var t = new Date , r = parseInt(e.substr(0, 4), 10) , a = parseInt(e.substr(4, 2), 10) - 1 , n = parseInt(e.substr(6, 2), 10) , i = parseInt(e.substr(8, 2), 10) , s = parseInt(e.substr(10, 2), 10) , o = parseInt(e.substr(12, 2), 10) , c = 0 , u = 0 , l = !1; "Z" === e.charAt(e.length - 1) && (l = !0); var p = e.length - 5 , f = e.charAt(p); if ("+" === f || "-" === f) { u = 60 * parseInt(e.substr(p + 1, 2), 10) + parseInt(e.substr(p + 4, 2), 10), u *= 6e4, "+" === f && (u *= -1), l = !0 } return "." === e.charAt(14) && (c = 1e3 * parseFloat(e.substr(14), 10)), l ? (t.setUTCFullYear(r, a, n), t.setUTCHours(i, s, o, c), t.setTime(+t + u)) : (t.setFullYear(r, a, n), t.setHours(i, s, o, c)), t } , s.dateToUtcTime = function(e) { if ("string" == typeof e) return e; var t = "" , r = []; r.push(("" + e.getUTCFullYear()).substr(2)), r.push("" + (e.getUTCMonth() + 1)), r.push("" + e.getUTCDate()), r.push("" + e.getUTCHours()), r.push("" + e.getUTCMinutes()), r.push("" + e.getUTCSeconds()); for (var a = 0; a < r.length; ++a) r[a].length < 2 && (t += "0"), t += r[a]; return t += "Z" } , s.dateToGeneralizedTime = function(e) { if ("string" == typeof e) return e; var t = "" , r = []; r.push("" + e.getUTCFullYear()), r.push("" + (e.getUTCMonth() + 1)), r.push("" + e.getUTCDate()), r.push("" + e.getUTCHours()), r.push("" + e.getUTCMinutes()), r.push("" + e.getUTCSeconds()); for (var a = 0; a < r.length; ++a) r[a].length < 2 && (t += "0"), t += r[a]; return t += "Z" } , s.integerToDer = function(e) { var t = i.util.createBuffer(); if (e >= -128 && e < 128) return t.putSignedInt(e, 8); if (e >= -32768 && e < 32768) return t.putSignedInt(e, 16); if (e >= -8388608 && e < 8388608) return t.putSignedInt(e, 24); if (e >= -2147483648 && e < 2147483648) return t.putSignedInt(e, 32); var r = new Error("Integer too large; max is 32-bits."); throw r.integer = e, r } , s.derToInteger = function(e) { "string" == typeof e && (e = i.util.createBuffer(e)); var t = 8 * e.length(); if (t > 32) throw new Error("Integer too large; max is 32-bits."); return e.getSignedInt(t) } , s.validate = function(e, t, r, a) { var n = !1; if (e.tagClass !== t.tagClass && void 0 !== t.tagClass || e.type !== t.type && void 0 !== t.type) a && (e.tagClass !== t.tagClass && a.push("[" + t.name + '] Expected tag class "' + t.tagClass + '", got "' + e.tagClass + '"'), e.type !== t.type && a.push("[" + t.name + '] Expected type "' + t.type + '", got "' + e.type + '"')); else if (e.constructed === t.constructed || void 0 === t.constructed) { if (n = !0, t.value && i.util.isArray(t.value)) for (var o = 0, c = 0; n && c < t.value.length; ++c) n = t.value[c].optional || !1, e.value[o] && (n = s.validate(e.value[o], t.value[c], r, a), n ? ++o : t.value[c].optional && (n = !0)), !n && a && a.push("[" + t.name + '] Tag class "' + t.tagClass + '", type "' + t.type + '" expected value length "' + t.value.length + '", got "' + e.value.length + '"'); if (n && r && (t.capture && (r[t.capture] = e.value), t.captureAsn1 && (r[t.captureAsn1] = e), t.captureBitStringContents && "bitStringContents"in e && (r[t.captureBitStringContents] = e.bitStringContents), t.captureBitStringValue && "bitStringContents"in e)) { if (e.bitStringContents.length < 2) r[t.captureBitStringValue] = ""; else { var u = e.bitStringContents.charCodeAt(0); if (0 !== u) throw new Error("captureBitStringValue only supported for zero unused bits"); r[t.captureBitStringValue] = e.bitStringContents.slice(1) } } } else a && a.push("[" + t.name + '] Expected constructed "' + t.constructed + '", got "' + e.constructed + '"'); return n } ; var c = /[^\\u0000-\\u00ff]/; s.prettyPrint = function(e, t, r) { var a = ""; t = t || 0, r = r || 2, t > 0 && (a += "\n"); for (var n = "", o = 0; o < t * r; ++o) n += " "; switch (a += n + "Tag: ", e.tagClass) { case s.Class.UNIVERSAL: a += "Universal:"; break; case s.Class.APPLICATION: a += "Application:"; break; case s.Class.CONTEXT_SPECIFIC: a += "Context-Specific:"; break; case s.Class.PRIVATE: a += "Private:" } if (e.tagClass === s.Class.UNIVERSAL) switch (a += e.type, e.type) { case s.Type.NONE: a += " (None)"; break; case s.Type.BOOLEAN: a += " (Boolean)"; break; case s.Type.INTEGER: a += " (Integer)"; break; case s.Type.BITSTRING: a += " (Bit string)"; break; case s.Type.OCTETSTRING: a += " (Octet string)"; break; case s.Type.NULL: a += " (Null)"; break; case s.Type.OID: a += " (Object Identifier)"; break; case s.Type.ODESC: a += " (Object Descriptor)"; break; case s.Type.EXTERNAL: a += " (External or Instance of)"; break; case s.Type.REAL: a += " (Real)"; break; case s.Type.ENUMERATED: a += " (Enumerated)"; break; case s.Type.EMBEDDED: a += " (Embedded PDV)"; break; case s.Type.UTF8: a += " (UTF8)"; break; case s.Type.ROID: a += " (Relative Object Identifier)"; break; case s.Type.SEQUENCE: a += " (Sequence)"; break; case s.Type.SET: a += " (Set)"; break; case s.Type.PRINTABLESTRING: a += " (Printable String)"; break; case s.Type.IA5String: a += " (IA5String (ASCII))"; break; case s.Type.UTCTIME: a += " (UTC time)"; break; case s.Type.GENERALIZEDTIME: a += " (Generalized time)"; break; case s.Type.BMPSTRING: a += " (BMP String)" } else a += e.type; if (a += "\n", a += n + "Constructed: " + e.constructed + "\n", e.composed) { for (var u = 0, l = "", o = 0; o < e.value.length; ++o) void 0 !== e.value[o] && (u += 1, l += s.prettyPrint(e.value[o], t + 1, r), o + 1 < e.value.length && (l += ",")); a += n + "Sub values: " + u + l } else { if (a += n + "Value: ", e.type === s.Type.OID) { var p = s.derToOid(e.value); a += p, i.pki && i.pki.oids && p in i.pki.oids && (a += " (" + i.pki.oids[p] + ") ") } if (e.type === s.Type.INTEGER) try { a += s.derToInteger(e.value) } catch (t) { a += "0x" + i.util.bytesToHex(e.value) } else if (e.type === s.Type.BITSTRING) { if (e.value.length > 1 ? a += "0x" + i.util.bytesToHex(e.value.slice(1)) : a += "(none)", e.value.length > 0) { var f = e.value.charCodeAt(0); 1 == f ? a += " (1 unused bit shown)" : f > 1 && (a += " (" + f + " unused bits shown)") } } else e.type === s.Type.OCTETSTRING ? (c.test(e.value) || (a += "(" + e.value + ") "), a += "0x" + i.util.bytesToHex(e.value)) : e.type === s.Type.UTF8 ? a += i.util.decodeUtf8(e.value) : e.type === s.Type.PRINTABLESTRING || e.type === s.Type.IA5String ? a += e.value : c.test(e.value) ? a += "0x" + i.util.bytesToHex(e.value) : 0 === e.value.length ? a += "[null]" : a += e.value } return a } } , function(e, t, r) { var a = r(0); e.exports = a.md = a.md || {}, a.md.algorithms = a.md.algorithms || {} } , function(e, t, r) { function a(e, t) { var r = function() { return new c.aes.Algorithm(e,t) }; c.cipher.registerAlgorithm(e, r) } function n() { d = !0, p = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]; for (var e = new Array(256), t = 0; t < 128; ++t) e[t] = t << 1, e[t + 128] = t + 128 << 1 ^ 283; u = new Array(256), l = new Array(256), f = new Array(4), h = new Array(4); for (var t = 0; t < 4; ++t) f[t] = new Array(256), h[t] = new Array(256); for (var r, a, n, i, s, o, c, y = 0, g = 0, t = 0; t < 256; ++t) { i = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4, i = i >> 8 ^ 255 & i ^ 99, u[y] = i, l[i] = y, s = e[i], r = e[y], a = e[r], n = e[a], o = s << 24 ^ i << 16 ^ i << 8 ^ i ^ s, c = (r ^ a ^ n) << 24 ^ (y ^ n) << 16 ^ (y ^ a ^ n) << 8 ^ y ^ r ^ n; for (var v = 0; v < 4; ++v) f[v][y] = o, h[v][i] = c, o = o << 24 | o >>> 8, c = c << 24 | c >>> 8; 0 === y ? y = g = 1 : (y = r ^ e[e[e[r ^ n]]], g ^= e[e[g]]) } } function i(e, t) { for (var r, a = e.slice(0), n = 1, i = a.length, s = i + 6 + 1, o = y * s, c = i; c < o; ++c) r = a[c - 1], c % i == 0 ? (r = u[r >>> 16 & 255] << 24 ^ u[r >>> 8 & 255] << 16 ^ u[255 & r] << 8 ^ u[r >>> 24] ^ p[n] << 24, n++) : i > 6 && c % i == 4 && (r = u[r >>> 24] << 24 ^ u[r >>> 16 & 255] << 16 ^ u[r >>> 8 & 255] << 8 ^ u[255 & r]), a[c] = a[c - i] ^ r; if (t) { var l, f = h[0], d = h[1], g = h[2], v = h[3], m = a.slice(0); o = a.length; for (var c = 0, C = o - y; c < o; c += y, C -= y) if (0 === c || c === o - y) m[c] = a[C], m[c + 1] = a[C + 3], m[c + 2] = a[C + 2], m[c + 3] = a[C + 1]; else for (var E = 0; E < y; ++E) l = a[C + E], m[c + (3 & -E)] = f[u[l >>> 24]] ^ d[u[l >>> 16 & 255]] ^ g[u[l >>> 8 & 255]] ^ v[u[255 & l]]; a = m } return a } function s(e, t, r, a) { var n, i, s, o, c, p = e.length / 4 - 1; a ? (n = h[0], i = h[1], s = h[2], o = h[3], c = l) : (n = f[0], i = f[1], s = f[2], o = f[3], c = u); var d, y, g, v, m, C, E; d = t[0] ^ e[0], y = t[a ? 3 : 1] ^ e[1], g = t[2] ^ e[2], v = t[a ? 1 : 3] ^ e[3]; for (var S = 3, T = 1; T < p; ++T) m = n[d >>> 24] ^ i[y >>> 16 & 255] ^ s[g >>> 8 & 255] ^ o[255 & v] ^ e[++S], C = n[y >>> 24] ^ i[g >>> 16 & 255] ^ s[v >>> 8 & 255] ^ o[255 & d] ^ e[++S], E = n[g >>> 24] ^ i[v >>> 16 & 255] ^ s[d >>> 8 & 255] ^ o[255 & y] ^ e[++S], v = n[v >>> 24] ^ i[d >>> 16 & 255] ^ s[y >>> 8 & 255] ^ o[255 & g] ^ e[++S], d = m, y = C, g = E; r[0] = c[d >>> 24] << 24 ^ c[y >>> 16 & 255] << 16 ^ c[g >>> 8 & 255] << 8 ^ c[255 & v] ^ e[++S], r[a ? 3 : 1] = c[y >>> 24] << 24 ^ c[g >>> 16 & 255] << 16 ^ c[v >>> 8 & 255] << 8 ^ c[255 & d] ^ e[++S], r[2] = c[g >>> 24] << 24 ^ c[v >>> 16 & 255] << 16 ^ c[d >>> 8 & 255] << 8 ^ c[255 & y] ^ e[++S], r[a ? 1 : 3] = c[v >>> 24] << 24 ^ c[d >>> 16 & 255] << 16 ^ c[y >>> 8 & 255] << 8 ^ c[255 & g] ^ e[++S] } function o(e) { e = e || {}; var t, r = (e.mode || "CBC").toUpperCase(), a = "AES-" + r; t = e.decrypt ? c.cipher.createDecipher(a, e.key) : c.cipher.createCipher(a, e.key); var n = t.start; return t.start = function(e, r) { var a = null; r instanceof c.util.ByteBuffer && (a = r, r = {}), r = r || {}, r.output = a, r.iv = e, n.call(t, r) } , t } var c = r(0); r(13), r(19), r(1), e.exports = c.aes = c.aes || {}, c.aes.startEncrypting = function(e, t, r, a) { var n = o({ key: e, output: r, decrypt: !1, mode: a }); return n.start(t), n } , c.aes.createEncryptionCipher = function(e, t) { return o({ key: e, output: null, decrypt: !1, mode: t }) } , c.aes.startDecrypting = function(e, t, r, a) { var n = o({ key: e, output: r, decrypt: !0, mode: a }); return n.start(t), n } , c.aes.createDecryptionCipher = function(e, t) { return o({ key: e, output: null, decrypt: !0, mode: t }) } , c.aes.Algorithm = function(e, t) { d || n(); var r = this; r.name = e, r.mode = new t({ blockSize: 16, cipher: { encrypt: function(e, t) { return s(r._w, e, t, !1) }, decrypt: function(e, t) { return s(r._w, e, t, !0) } } }), r._init = !1 } , c.aes.Algorithm.prototype.initialize = function(e) { if (!this._init) { var t, r = e.key; if ("string" != typeof r || 16 !== r.length && 24 !== r.length && 32 !== r.length) { if (c.util.isArray(r) && (16 === r.length || 24 === r.length || 32 === r.length)) { t = r, r = c.util.createBuffer(); for (var a = 0; a < t.length; ++a) r.putByte(t[a]) } } else r = c.util.createBuffer(r); if (!c.util.isArray(r)) { t = r, r = []; var n = t.length(); if (16 === n || 24 === n || 32 === n) { n >>>= 2; for (var a = 0; a < n; ++a) r.push(t.getInt32()) } } if (!c.util.isArray(r) || 4 !== r.length && 6 !== r.length && 8 !== r.length) throw new Error("Invalid key parameter."); var s = this.mode.name , o = -1 !== ["CFB", "OFB", "CTR", "GCM"].indexOf(s); this._w = i(r, e.decrypt && !o), this._init = !0 } } , c.aes._expandKey = function(e, t) { return d || n(), i(e, t) } , c.aes._updateBlock = s, a("AES-ECB", c.cipher.modes.ecb), a("AES-CBC", c.cipher.modes.cbc), a("AES-CFB", c.cipher.modes.cfb), a("AES-OFB", c.cipher.modes.ofb), a("AES-CTR", c.cipher.modes.ctr), a("AES-GCM", c.cipher.modes.gcm); var u, l, p, f, h, d = !1, y = 4 } , function(e, t, r) { function a(e, t) { s[e] = t, s[t] = e } function n(e, t) { s[e] = t } var i = r(0); i.pki = i.pki || {}; var s = e.exports = i.pki.oids = i.oids = i.oids || {}; a("1.2.840.113549.1.1.1", "rsaEncryption"), a("1.2.840.113549.1.1.4", "md5WithRSAEncryption"), a("1.2.840.113549.1.1.5", "sha1WithRSAEncryption"), a("1.2.840.113549.1.1.7", "RSAES-OAEP"), a("1.2.840.113549.1.1.8", "mgf1"), a("1.2.840.113549.1.1.9", "pSpecified"), a("1.2.840.113549.1.1.10", "RSASSA-PSS"), a("1.2.840.113549.1.1.11", "sha256WithRSAEncryption"), a("1.2.840.113549.1.1.12", "sha384WithRSAEncryption"), a("1.2.840.113549.1.1.13", "sha512WithRSAEncryption"), a("1.2.840.10040.4.3", "dsa-with-sha1"), a("1.3.14.3.2.7", "desCBC"), a("1.3.14.3.2.26", "sha1"), a("2.16.840.1.101.3.4.2.1", "sha256"), a("2.16.840.1.101.3.4.2.2", "sha384"), a("2.16.840.1.101.3.4.2.3", "sha512"), a("1.2.840.113549.2.5", "md5"), a("1.2.840.113549.1.7.1", "data"), a("1.2.840.113549.1.7.2", "signedData"), a("1.2.840.113549.1.7.3", "envelopedData"), a("1.2.840.113549.1.7.4", "signedAndEnvelopedData"), a("1.2.840.113549.1.7.5", "digestedData"), a("1.2.840.113549.1.7.6", "encryptedData"), a("1.2.840.113549.1.9.1", "emailAddress"), a("1.2.840.113549.1.9.2", "unstructuredName"), a("1.2.840.113549.1.9.3", "contentType"), a("1.2.840.113549.1.9.4", "messageDigest"), a("1.2.840.113549.1.9.5", "signingTime"), a("1.2.840.113549.1.9.6", "counterSignature"), a("1.2.840.113549.1.9.7", "challengePassword"), a("1.2.840.113549.1.9.8", "unstructuredAddress"), a("1.2.840.113549.1.9.14", "extensionRequest"), a("1.2.840.113549.1.9.20", "friendlyName"), a("1.2.840.113549.1.9.21", "localKeyId"), a("1.2.840.113549.1.9.22.1", "x509Certificate"), a("1.2.840.113549.1.12.10.1.1", "keyBag"), a("1.2.840.113549.1.12.10.1.2", "pkcs8ShroudedKeyBag"), a("1.2.840.113549.1.12.10.1.3", "certBag"), a("1.2.840.113549.1.12.10.1.4", "crlBag"), a("1.2.840.113549.1.12.10.1.5", "secretBag"), a("1.2.840.113549.1.12.10.1.6", "safeContentsBag"), a("1.2.840.113549.1.5.13", "pkcs5PBES2"), a("1.2.840.113549.1.5.12", "pkcs5PBKDF2"), a("1.2.840.113549.1.12.1.1", "pbeWithSHAAnd128BitRC4"), a("1.2.840.113549.1.12.1.2", "pbeWithSHAAnd40BitRC4"), a("1.2.840.113549.1.12.1.3", "pbeWithSHAAnd3-KeyTripleDES-CBC"), a("1.2.840.113549.1.12.1.4", "pbeWithSHAAnd2-KeyTripleDES-CBC"), a("1.2.840.113549.1.12.1.5", "pbeWithSHAAnd128BitRC2-CBC"), a("1.2.840.113549.1.12.1.6", "pbewithSHAAnd40BitRC2-CBC"), a("1.2.840.113549.2.7", "hmacWithSHA1"), a("1.2.840.113549.2.8", "hmacWithSHA224"), a("1.2.840.113549.2.9", "hmacWithSHA256"), a("1.2.840.113549.2.10", "hmacWithSHA384"), a("1.2.840.113549.2.11", "hmacWithSHA512"), a("1.2.840.113549.3.7", "des-EDE3-CBC"), a("2.16.840.1.101.3.4.1.2", "aes128-CBC"), a("2.16.840.1.101.3.4.1.22", "aes192-CBC"), a("2.16.840.1.101.3.4.1.42", "aes256-CBC"), a("2.5.4.3", "commonName"), a("2.5.4.5", "serialName"), a("2.5.4.6", "countryName"), a("2.5.4.7", "localityName"), a("2.5.4.8", "stateOrProvinceName"), a("2.5.4.10", "organizationName"), a("2.5.4.11", "organizationalUnitName"), a("2.5.4.13", "description"), a("2.16.840.1.113730.1.1", "nsCertType"), a("2.16.840.1.113730.1.13", "nsComment"), n("2.5.29.1", "authorityKeyIdentifier"), n("2.5.29.2", "keyAttributes"), n("2.5.29.3", "certificatePolicies"), n("2.5.29.4", "keyUsageRestriction"), n("2.5.29.5", "policyMapping"), n("2.5.29.6", "subtreesConstraint"), n("2.5.29.7", "subjectAltName"), n("2.5.29.8", "issuerAltName"), n("2.5.29.9", "subjectDirectoryAttributes"), n("2.5.29.10", "basicConstraints"), n("2.5.29.11", "nameConstraints"), n("2.5.29.12", "policyConstraints"), n("2.5.29.13", "basicConstraints"), a("2.5.29.14", "subjectKeyIdentifier"), a("2.5.29.15", "keyUsage"), n("2.5.29.16", "privateKeyUsagePeriod"), a("2.5.29.17", "subjectAltName"), a("2.5.29.18", "issuerAltName"), a("2.5.29.19", "basicConstraints"), n("2.5.29.20", "cRLNumber"), n("2.5.29.21", "cRLReason"), n("2.5.29.22", "expirationDate"), n("2.5.29.23", "instructionCode"), n("2.5.29.24", "invalidityDate"), n("2.5.29.25", "cRLDistributionPoints"), n("2.5.29.26", "issuingDistributionPoint"), n("2.5.29.27", "deltaCRLIndicator"), n("2.5.29.28", "issuingDistributionPoint"), n("2.5.29.29", "certificateIssuer"), n("2.5.29.30", "nameConstraints"), a("2.5.29.31", "cRLDistributionPoints"), a("2.5.29.32", "certificatePolicies"), n("2.5.29.33", "policyMappings"), n("2.5.29.34", "policyConstraints"), a("2.5.29.35", "authorityKeyIdentifier"), n("2.5.29.36", "policyConstraints"), a("2.5.29.37", "extKeyUsage"), n("2.5.29.46", "freshestCRL"), n("2.5.29.54", "inhibitAnyPolicy"), a("1.3.6.1.4.1.11129.2.4.2", "timestampList"), a("1.3.6.1.5.5.7.1.1", "authorityInfoAccess"), a("1.3.6.1.5.5.7.3.1", "serverAuth"), a("1.3.6.1.5.5.7.3.2", "clientAuth"), a("1.3.6.1.5.5.7.3.3", "codeSigning"), a("1.3.6.1.5.5.7.3.4", "emailProtection"), a("1.3.6.1.5.5.7.3.8", "timeStamping") } , function(e, t, r) { function a(e) { for (var t = e.name + ": ", r = [], a = function(e, t) { return " " + t }, n = 0; n < e.values.length; ++n) r.push(e.values[n].replace(/^(\S+\r\n)/, a)); t += r.join(",") + "\r\n"; for (var i = 0, s = -1, n = 0; n < t.length; ++n, ++i) if (i > 65 && -1 !== s) { var o = t[s]; "," === o ? (++s, t = t.substr(0, s) + "\r\n " + t.substr(s)) : t = t.substr(0, s) + "\r\n" + o + t.substr(s + 1), i = n - s - 1, s = -1, ++n } else " " !== t[n] && "\t" !== t[n] && "," !== t[n] || (s = n); return t } function n(e) { return e.replace(/^\s+/, "") } var i = r(0); r(1); var s = e.exports = i.pem = i.pem || {}; s.encode = function(e, t) { t = t || {}; var r, n = "-----BEGIN " + e.type + "-----\r\n"; if (e.procType && (r = { name: "Proc-Type", values: [String(e.procType.version), e.procType.type] }, n += a(r)), e.contentDomain && (r = { name: "Content-Domain", values: [e.contentDomain] }, n += a(r)), e.dekInfo && (r = { name: "DEK-Info", values: [e.dekInfo.algorithm] }, e.dekInfo.parameters && r.values.push(e.dekInfo.parameters), n += a(r)), e.headers) for (var s = 0; s < e.headers.length; ++s) n += a(e.headers[s]); return e.procType && (n += "\r\n"), n += i.util.encode64(e.body, t.maxline || 64) + "\r\n", n += "-----END " + e.type + "-----\r\n" } , s.decode = function(e) { for (var t, r = [], a = /\s*-----BEGIN ([A-Z0-9- ]+)-----\r?\n?([\x21-\x7e\s]+?(?:\r?\n\r?\n))?([:A-Za-z0-9+\/=\s]+?)-----END \1-----/g, s = /([\x21-\x7e]+):\s*([\x21-\x7e\s^:]+)/, o = /\r?\n/; ; ) { if (!(t = a.exec(e))) break; var c = { type: t[1], procType: null, contentDomain: null, dekInfo: null, headers: [], body: i.util.decode64(t[3]) }; if (r.push(c), t[2]) { for (var u = t[2].split(o), l = 0; t && l < u.length; ) { for (var p = u[l].replace(/\s+$/, ""), f = l + 1; f < u.length; ++f) { var h = u[f]; if (!/\s/.test(h[0])) break; p += h, l = f } if (t = p.match(s)) { for (var d = { name: t[1], values: [] }, y = t[2].split(","), g = 0; g < y.length; ++g) d.values.push(n(y[g])); if (c.procType) if (c.contentDomain || "Content-Domain" !== d.name) if (c.dekInfo || "DEK-Info" !== d.name) c.headers.push(d); else { if (0 === d.values.length) throw new Error('Invalid PEM formatted message. The "DEK-Info" header must have at least one subfield.'); c.dekInfo = { algorithm: y[0], parameters: y[1] || null } } else c.contentDomain = y[0] || ""; else { if ("Proc-Type" !== d.name) throw new Error('Invalid PEM formatted message. The first encapsulated header must be "Proc-Type".'); if (2 !== d.values.length) throw new Error('Invalid PEM formatted message. The "Proc-Type" header must have two subfields.'); c.procType = { version: y[0], type: y[1] } } } ++l } if ("ENCRYPTED" === c.procType && !c.dekInfo) throw new Error('Invalid PEM formatted message. The "DEK-Info" header must be present if "Proc-Type" is "ENCRYPTED".') } } if (0 === r.length) throw new Error("Invalid PEM formatted message."); return r } } , function(e, t, r) { var a = r(0); r(4), r(1), (e.exports = a.hmac = a.hmac || {}).create = function() { var e = null , t = null , r = null , n = null , i = {}; return i.start = function(i, s) { if (null !== i) if ("string" == typeof i) { if (!((i = i.toLowerCase())in a.md.algorithms)) throw new Error('Unknown hash algorithm "' + i + '"'); t = a.md.algorithms[i].create() } else t = i; if (null === s) s = e; else { if ("string" == typeof s) s = a.util.createBuffer(s); else if (a.util.isArray(s)) { var o = s; s = a.util.createBuffer(); for (var c = 0; c < o.length; ++c) s.putByte(o[c]) } var u = s.length(); u > t.blockLength && (t.start(), t.update(s.bytes()), s = t.digest()), r = a.util.createBuffer(), n = a.util.createBuffer(), u = s.length(); for (var c = 0; c < u; ++c) { var o = s.at(c); r.putByte(54 ^ o), n.putByte(92 ^ o) } if (u < t.blockLength) for (var o = t.blockLength - u, c = 0; c < o; ++c) r.putByte(54), n.putByte(92); e = s, r = r.bytes(), n = n.bytes() } t.start(), t.update(r) } , i.update = function(e) { t.update(e) } , i.getMac = function() { var e = t.digest().bytes(); return t.start(), t.update(n), t.update(e), t.digest() } , i.digest = i.getMac, i } } , function(e, t, r) { function a() { o = String.fromCharCode(128), o += i.util.fillString(String.fromCharCode(0), 64), c = !0 } function n(e, t, r) { for (var a, n, i, s, o, c, u, l, p = r.length(); p >= 64; ) { for (n = e.h0, i = e.h1, s = e.h2, o = e.h3, c = e.h4, l = 0; l < 16; ++l) a = r.getInt32(), t[l] = a, u = o ^ i & (s ^ o), a = (n << 5 | n >>> 27) + u + c + 1518500249 + a, c = o, o = s, s = (i << 30 | i >>> 2) >>> 0, i = n, n = a; for (; l < 20; ++l) a = t[l - 3] ^ t[l - 8] ^ t[l - 14] ^ t[l - 16], a = a << 1 | a >>> 31, t[l] = a, u = o ^ i & (s ^ o), a = (n << 5 | n >>> 27) + u + c + 1518500249 + a, c = o, o = s, s = (i << 30 | i >>> 2) >>> 0, i = n, n = a; for (; l < 32; ++l) a = t[l - 3] ^ t[l - 8] ^ t[l - 14] ^ t[l - 16], a = a << 1 | a >>> 31, t[l] = a, u = i ^ s ^ o, a = (n << 5 | n >>> 27) + u + c + 1859775393 + a, c = o, o = s, s = (i << 30 | i >>> 2) >>> 0, i = n, n = a; for (; l < 40; ++l) a = t[l - 6] ^ t[l - 16] ^ t[l - 28] ^ t[l - 32], a = a << 2 | a >>> 30, t[l] = a, u = i ^ s ^ o, a = (n << 5 | n >>> 27) + u + c + 1859775393 + a, c = o, o = s, s = (i << 30 | i >>> 2) >>> 0, i = n, n = a; for (; l < 60; ++l) a = t[l - 6] ^ t[l - 16] ^ t[l - 28] ^ t[l - 32], a = a << 2 | a >>> 30, t[l] = a, u = i & s | o & (i ^ s), a = (n << 5 | n >>> 27) + u + c + 2400959708 + a, c = o, o = s, s = (i << 30 | i >>> 2) >>> 0, i = n, n = a; for (; l < 80; ++l) a = t[l - 6] ^ t[l - 16] ^ t[l - 28] ^ t[l - 32], a = a << 2 | a >>> 30, t[l] = a, u = i ^ s ^ o, a = (n << 5 | n >>> 27) + u + c + 3395469782 + a, c = o, o = s, s = (i << 30 | i >>> 2) >>> 0, i = n, n = a; e.h0 = e.h0 + n | 0, e.h1 = e.h1 + i | 0, e.h2 = e.h2 + s | 0, e.h3 = e.h3 + o | 0, e.h4 = e.h4 + c | 0, p -= 64 } } var i = r(0); r(4), r(1); var s = e.exports = i.sha1 = i.sha1 || {}; i.md.sha1 = i.md.algorithms.sha1 = s, s.create = function() { c || a(); var e = null , t = i.util.createBuffer() , r = new Array(80) , s = { algorithm: "sha1", blockLength: 64, digestLength: 20, messageLength: 0, fullMessageLength: null, messageLengthSize: 8 }; return s.start = function() { s.messageLength = 0, s.fullMessageLength = s.messageLength64 = []; for (var r = s.messageLengthSize / 4, a = 0; a < r; ++a) s.fullMessageLength.push(0); return t = i.util.createBuffer(), e = { h0: 1732584193, h1: 4023233417, h2: 2562383102, h3: 271733878, h4: 3285377520 }, s } , s.start(), s.update = function(a, o) { "utf8" === o && (a = i.util.encodeUtf8(a)); var c = a.length; s.messageLength += c, c = [c / 4294967296 >>> 0, c >>> 0]; for (var u = s.fullMessageLength.length - 1; u >= 0; --u) s.fullMessageLength[u] += c[1], c[1] = c[0] + (s.fullMessageLength[u] / 4294967296 >>> 0), s.fullMessageLength[u] = s.fullMessageLength[u] >>> 0, c[0] = c[1] / 4294967296 >>> 0; return t.putBytes(a), n(e, r, t), (t.read > 2048 || 0 === t.length()) && t.compact(), s } , s.digest = function() { var a = i.util.createBuffer(); a.putBytes(t.bytes()); var c = s.fullMessageLength[s.fullMessageLength.length - 1] + s.messageLengthSize , u = c & s.blockLength - 1; a.putBytes(o.substr(0, s.blockLength - u)); for (var l, p, f = 8 * s.fullMessageLength[0], h = 0; h < s.fullMessageLength.length - 1; ++h) l = 8 * s.fullMessageLength[h + 1], p = l / 4294967296 >>> 0, f += p, a.putInt32(f >>> 0), f = l >>> 0; a.putInt32(f); var d = { h0: e.h0, h1: e.h1, h2: e.h2, h3: e.h3, h4: e.h4 }; n(d, r, a); var y = i.util.createBuffer(); return y.putInt32(d.h0), y.putInt32(d.h1), y.putInt32(d.h2), y.putInt32(d.h3), y.putInt32(d.h4), y } , s } ; var o = null , c = !1 } , function(e, t, r) { function a(e, t) { var r = function() { return new o.des.Algorithm(e,t) }; o.cipher.registerAlgorithm(e, r) } function n(e) { for (var t, r = [0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428, 66048, 66052, 536936960, 536936964], a = [0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697], n = [0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272], i = [0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144], s = [0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256], o = [0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488], c = [0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746], u = [0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568], l = [0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578], p = [0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024, 268436480, 1032, 268436488], f = [0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768, 1056800], h = [0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744], d = [0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304, 528400, 134742032, 134746128], y = [0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261], g = e.length() > 8 ? 3 : 1, v = [], m = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0], C = 0, E = 0; E < g; E++) { var S = e.getInt32() , T = e.getInt32(); t = 252645135 & (S >>> 4 ^ T), T ^= t, S ^= t << 4, t = 65535 & (T >>> -16 ^ S), S ^= t, T ^= t << -16, t = 858993459 & (S >>> 2 ^ T), T ^= t, S ^= t << 2, t = 65535 & (T >>> -16 ^ S), S ^= t, T ^= t << -16, t = 1431655765 & (S >>> 1 ^ T), T ^= t, S ^= t << 1, t = 16711935 & (T >>> 8 ^ S), S ^= t, T ^= t << 8, t = 1431655765 & (S >>> 1 ^ T), T ^= t, S ^= t << 1, t = S << 8 | T >>> 20 & 240, S = T << 24 | T << 8 & 16711680 | T >>> 8 & 65280 | T >>> 24 & 240, T = t; for (var I = 0; I < m.length; ++I) { m[I] ? (S = S << 2 | S >>> 26, T = T << 2 | T >>> 26) : (S = S << 1 | S >>> 27, T = T << 1 | T >>> 27), S &= -15, T &= -15; var b = r[S >>> 28] | a[S >>> 24 & 15] | n[S >>> 20 & 15] | i[S >>> 16 & 15] | s[S >>> 12 & 15] | o[S >>> 8 & 15] | c[S >>> 4 & 15] , A = u[T >>> 28] | l[T >>> 24 & 15] | p[T >>> 20 & 15] | f[T >>> 16 & 15] | h[T >>> 12 & 15] | d[T >>> 8 & 15] | y[T >>> 4 & 15]; t = 65535 & (A >>> 16 ^ b), v[C++] = b ^ t, v[C++] = A ^ t << 16 } } return v } function i(e, t, r, a) { var n, i = 32 === e.length ? 3 : 9; n = 3 === i ? a ? [30, -2, -2] : [0, 32, 2] : a ? [94, 62, -2, 32, 64, 2, 30, -2, -2] : [0, 32, 2, 62, 30, -2, 64, 96, 2]; var s, o = t[0], g = t[1]; s = 252645135 & (o >>> 4 ^ g), g ^= s, o ^= s << 4, s = 65535 & (o >>> 16 ^ g), g ^= s, o ^= s << 16, s = 858993459 & (g >>> 2 ^ o), o ^= s, g ^= s << 2, s = 16711935 & (g >>> 8 ^ o), o ^= s, g ^= s << 8, s = 1431655765 & (o >>> 1 ^ g), g ^= s, o ^= s << 1, o = o << 1 | o >>> 31, g = g << 1 | g >>> 31; for (var v = 0; v < i; v += 3) { for (var m = n[v + 1], C = n[v + 2], E = n[v]; E != m; E += C) { var S = g ^ e[E] , T = (g >>> 4 | g << 28) ^ e[E + 1]; s = o, o = g, g = s ^ (u[S >>> 24 & 63] | p[S >>> 16 & 63] | h[S >>> 8 & 63] | y[63 & S] | c[T >>> 24 & 63] | l[T >>> 16 & 63] | f[T >>> 8 & 63] | d[63 & T]) } s = o, o = g, g = s } o = o >>> 1 | o << 31, g = g >>> 1 | g << 31, s = 1431655765 & (o >>> 1 ^ g), g ^= s, o ^= s << 1, s = 16711935 & (g >>> 8 ^ o), o ^= s, g ^= s << 8, s = 858993459 & (g >>> 2 ^ o), o ^= s, g ^= s << 2, s = 65535 & (o >>> 16 ^ g), g ^= s, o ^= s << 16, s = 252645135 & (o >>> 4 ^ g), g ^= s, o ^= s << 4, r[0] = o, r[1] = g } function s(e) { e = e || {}; var t, r = (e.mode || "CBC").toUpperCase(), a = "DES-" + r; t = e.decrypt ? o.cipher.createDecipher(a, e.key) : o.cipher.createCipher(a, e.key); var n = t.start; return t.start = function(e, r) { var a = null; r instanceof o.util.ByteBuffer && (a = r, r = {}), r = r || {}, r.output = a, r.iv = e, n.call(t, r) } , t } var o = r(0); r(13), r(19), r(1), e.exports = o.des = o.des || {}, o.des.startEncrypting = function(e, t, r, a) { var n = s({ key: e, output: r, decrypt: !1, mode: a || (null === t ? "ECB" : "CBC") }); return n.start(t), n } , o.des.createEncryptionCipher = function(e, t) { return s({ key: e, output: null, decrypt: !1, mode: t }) } , o.des.startDecrypting = function(e, t, r, a) { var n = s({ key: e, output: r, decrypt: !0, mode: a || (null === t ? "ECB" : "CBC") }); return n.start(t), n } , o.des.createDecryptionCipher = function(e, t) { return s({ key: e, output: null, decrypt: !0, mode: t }) } , o.des.Algorithm = function(e, t) { var r = this; r.name = e, r.mode = new t({ blockSize: 8, cipher: { encrypt: function(e, t) { return i(r._keys, e, t, !1) }, decrypt: function(e, t) { return i(r._keys, e, t, !0) } } }), r._init = !1 } , o.des.Algorithm.prototype.initialize = function(e) { if (!this._init) { var t = o.util.createBuffer(e.key); if (0 === this.name.indexOf("3DES") && 24 !== t.length()) throw new Error("Invalid Triple-DES key size: " + 8 * t.length()); this._keys = n(t), this._init = !0 } } , a("DES-ECB", o.cipher.modes.ecb), a("DES-CBC", o.cipher.modes.cbc), a("DES-CFB", o.cipher.modes.cfb), a("DES-OFB", o.cipher.modes.ofb), a("DES-CTR", o.cipher.modes.ctr), a("3DES-ECB", o.cipher.modes.ecb), a("3DES-CBC", o.cipher.modes.cbc), a("3DES-CFB", o.cipher.modes.cfb), a("3DES-OFB", o.cipher.modes.ofb), a("3DES-CTR", o.cipher.modes.ctr); var c = [16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756] , u = [-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, -2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344] , l = [520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584] , p = [8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928] , f = [256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080] , h = [536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312] , d = [2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154] , y = [268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696] } , function(e, t, r) { function a(e, t, r) { var a = f.util.createBuffer() , n = Math.ceil(t.n.bitLength() / 8); if (e.length > n - 11) { var i = new Error("Message is too long for PKCS#1 v1.5 padding."); throw i.length = e.length, i.max = n - 11, i } a.putByte(0), a.putByte(r); var s, o = n - 3 - e.length; if (0 === r || 1 === r) { s = 0 === r ? 0 : 255; for (var c = 0; c < o; ++c) a.putByte(s) } else for (; o > 0; ) { for (var u = 0, l = f.random.getBytes(o), c = 0; c < o; ++c) s = l.charCodeAt(c), 0 === s ? ++u : a.putByte(s); o = u } return a.putByte(0), a.putBytes(e), a } function n(e, t, r, a) { var n = Math.ceil(t.n.bitLength() / 8) , i = f.util.createBuffer(e) , s = i.getByte() , o = i.getByte(); if (0 !== s || r && 0 !== o && 1 !== o || !r && 2 != o || r && 0 === o && void 0 === a) throw new Error("Encryption block is invalid."); var c = 0; if (0 === o) { c = n - 3 - a; for (var u = 0; u < c; ++u) if (0 !== i.getByte()) throw new Error("Encryption block is invalid.") } else if (1 === o) for (c = 0; i.length() > 1; ) { if (255 !== i.getByte()) { --i.read; break } ++c } else if (2 === o) for (c = 0; i.length() > 1; ) { if (0 === i.getByte()) { --i.read; break } ++c } if (0 !== i.getByte() || c !== n - 3 - i.length()) throw new Error("Encryption block is invalid."); return i.getBytes() } function i(e, t, r) { function a() { n(e.pBits, function(t, a) { return t ? r(t) : (e.p = a, null !== e.q ? i(t, e.q) : void n(e.qBits, i)) }) } function n(e, t) { f.prime.generateProbablePrime(e, s, t) } function i(t, s) { if (t) return r(t); if (e.q = s, e.p.compareTo(e.q) < 0) { var o = e.p; e.p = e.q, e.q = o } if (0 !== e.p.subtract(h.ONE).gcd(e.e).compareTo(h.ONE)) return e.p = null, void a(); if (0 !== e.q.subtract(h.ONE).gcd(e.e).compareTo(h.ONE)) return e.q = null, void n(e.qBits, i); if (e.p1 = e.p.subtract(h.ONE), e.q1 = e.q.subtract(h.ONE), e.phi = e.p1.multiply(e.q1), 0 !== e.phi.gcd(e.e).compareTo(h.ONE)) return e.p = e.q = null, void a(); if (e.n = e.p.multiply(e.q), e.n.bitLength() !== e.bits) return e.q = null, void n(e.qBits, i); var c = e.e.modInverse(e.phi); e.keys = { privateKey: v.rsa.setPrivateKey(e.n, e.e, c, e.p, e.q, c.mod(e.p1), c.mod(e.q1), e.q.modInverse(e.p)), publicKey: v.rsa.setPublicKey(e.n, e.e) }, r(null, e.keys) } "function" == typeof t && (r = t, t = {}), t = t || {}; var s = { algorithm: { name: t.algorithm || "PRIMEINC", options: { workers: t.workers || 2, workLoad: t.workLoad || 100, workerScript: t.workerScript } } }; "prng"in t && (s.prng = t.prng), a() } function s(e) { var t = e.toString(16); t[0] >= "8" && (t = "00" + t); var r = f.util.hexToBytes(t); return r.length > 1 && (0 === r.charCodeAt(0) && 0 == (128 & r.charCodeAt(1)) || 255 === r.charCodeAt(0) && 128 == (128 & r.charCodeAt(1))) ? r.substr(1) : r } function o(e) { return e <= 100 ? 27 : e <= 150 ? 18 : e <= 200 ? 15 : e <= 250 ? 12 : e <= 300 ? 9 : e <= 350 ? 8 : e <= 400 ? 7 : e <= 500 ? 6 : e <= 600 ? 5 : e <= 800 ? 4 : e <= 1250 ? 3 : 2 } function c(e) { return f.util.isNodejs && "function" == typeof d[e] } function u(e) { return void 0 !== g.globalScope && "object" == typeof g.globalScope.crypto && "object" == typeof g.globalScope.crypto.subtle && "function" == typeof g.globalScope.crypto.subtle[e] } function l(e) { return void 0 !== g.globalScope && "object" == typeof g.globalScope.msCrypto && "object" == typeof g.globalScope.msCrypto.subtle && "function" == typeof g.globalScope.msCrypto.subtle[e] } function p(e) { for (var t = f.util.hexToBytes(e.toString(16)), r = new Uint8Array(t.length), a = 0; a < t.length; ++a) r[a] = t.charCodeAt(a); return r } var f = r(0); if (r(3), r(12), r(6), r(26), r(27), r(2), r(1), void 0 === h) var h = f.jsbn.BigInteger; var d = f.util.isNodejs ? r(16) : null , y = f.asn1 , g = f.util; f.pki = f.pki || {}, e.exports = f.pki.rsa = f.rsa = f.rsa || {}; var v = f.pki , m = [6, 4, 2, 4, 2, 4, 6, 2] , C = { name: "PrivateKeyInfo", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, value: [{ name: "PrivateKeyInfo.version", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyVersion" }, { name: "PrivateKeyInfo.privateKeyAlgorithm", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, value: [{ name: "AlgorithmIdentifier.algorithm", tagClass: y.Class.UNIVERSAL, type: y.Type.OID, constructed: !1, capture: "privateKeyOid" }] }, { name: "PrivateKeyInfo", tagClass: y.Class.UNIVERSAL, type: y.Type.OCTETSTRING, constructed: !1, capture: "privateKey" }] } , E = { name: "RSAPrivateKey", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, value: [{ name: "RSAPrivateKey.version", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyVersion" }, { name: "RSAPrivateKey.modulus", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyModulus" }, { name: "RSAPrivateKey.publicExponent", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyPublicExponent" }, { name: "RSAPrivateKey.privateExponent", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyPrivateExponent" }, { name: "RSAPrivateKey.prime1", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyPrime1" }, { name: "RSAPrivateKey.prime2", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyPrime2" }, { name: "RSAPrivateKey.exponent1", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyExponent1" }, { name: "RSAPrivateKey.exponent2", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyExponent2" }, { name: "RSAPrivateKey.coefficient", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "privateKeyCoefficient" }] } , S = { name: "RSAPublicKey", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, value: [{ name: "RSAPublicKey.modulus", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "publicKeyModulus" }, { name: "RSAPublicKey.exponent", tagClass: y.Class.UNIVERSAL, type: y.Type.INTEGER, constructed: !1, capture: "publicKeyExponent" }] } , T = f.pki.rsa.publicKeyValidator = { name: "SubjectPublicKeyInfo", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, captureAsn1: "subjectPublicKeyInfo", value: [{ name: "SubjectPublicKeyInfo.AlgorithmIdentifier", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, value: [{ name: "AlgorithmIdentifier.algorithm", tagClass: y.Class.UNIVERSAL, type: y.Type.OID, constructed: !1, capture: "publicKeyOid" }] }, { name: "SubjectPublicKeyInfo.subjectPublicKey", tagClass: y.Class.UNIVERSAL, type: y.Type.BITSTRING, constructed: !1, value: [{ name: "SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey", tagClass: y.Class.UNIVERSAL, type: y.Type.SEQUENCE, constructed: !0, optional: !0, captureAsn1: "rsaPublicKey" }] }] } , I = function(e) { var t; if (!(e.algorithm in v.oids)) { var r = new Error("Unknown message digest algorithm."); throw r.algorithm = e.algorithm, r } t = v.oids[e.algorithm]; var a = y.oidToDer(t).getBytes() , n = y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, []) , i = y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, []); i.value.push(y.create(y.Class.UNIVERSAL, y.Type.OID, !1, a)), i.value.push(y.create(y.Class.UNIVERSAL, y.Type.NULL, !1, "")); var s = y.create(y.Class.UNIVERSAL, y.Type.OCTETSTRING, !1, e.digest().getBytes()); return n.value.push(i), n.value.push(s), y.toDer(n).getBytes() } , b = function(e, t, r) { if (r) return e.modPow(t.e, t.n); if (!t.p || !t.q) return e.modPow(t.d, t.n); t.dP || (t.dP = t.d.mod(t.p.subtract(h.ONE))), t.dQ || (t.dQ = t.d.mod(t.q.subtract(h.ONE))), t.qInv || (t.qInv = t.q.modInverse(t.p)); var a; do { a = new h(f.util.bytesToHex(f.random.getBytes(t.n.bitLength() / 8)),16) } while (a.compareTo(t.n) >= 0 || !a.gcd(t.n).equals(h.ONE)); e = e.multiply(a.modPow(t.e, t.n)).mod(t.n); for (var n = e.mod(t.p).modPow(t.dP, t.p), i = e.mod(t.q).modPow(t.dQ, t.q); n.compareTo(i) < 0; ) n = n.add(t.p); var s = n.subtract(i).multiply(t.qInv).mod(t.p).multiply(t.q).add(i); return s = s.multiply(a.modInverse(t.n)).mod(t.n) }; v.rsa.encrypt = function(e, t, r) { var n, i = r, s = Math.ceil(t.n.bitLength() / 8); !1 !== r && !0 !== r ? (i = 2 === r, n = a(e, t, r)) : (n = f.util.createBuffer(), n.putBytes(e)); for (var o = new h(n.toHex(),16), c = b(o, t, i), u = c.toString(16), l = f.util.createBuffer(), p = s - Math.ceil(u.length / 2); p > 0; ) l.putByte(0), --p; return l.putBytes(f.util.hexToBytes(u)), l.getBytes() } , v.rsa.decrypt = function(e, t, r, a) { var i = Math.ceil(t.n.bitLength() / 8); if (e.length !== i) { var s = new Error("Encrypted message length is invalid."); throw s.length = e.length, s.expected = i, s } var o = new h(f.util.createBuffer(e).toHex(),16); if (o.compareTo(t.n) >= 0) throw new Error("Encrypted message is invalid."); for (var c = b(o, t, r), u = c.toString(16), l = f.util.createBuffer(), p = i - Math.ceil(u.length / 2); p > 0; ) l.putByte(0), --p; return l.putBytes(f.util.hexToBytes(u)), !1 !== a ? n(l.getBytes(), t, r) : l.getBytes() } , v.rsa.createKeyPairGenerationState = function(e, t, r) { "string" == typeof e && (e = parseInt(e, 10)), e = e || 2048, r = r || {}; var a, n = r.prng || f.random, i = { nextBytes: function(e) { for (var t = n.getBytesSync(e.length), r = 0; r < e.length; ++r) e[r] = t.charCodeAt(r) } }, s = r.algorithm || "PRIMEINC"; if ("PRIMEINC" !== s) throw new Error("Invalid key generation algorithm: " + s); return a = { algorithm: s, state: 0, bits: e, rng: i, eInt: t || 65537, e: new h(null), p: null, q: null, qBits: e >> 1, pBits: e - (e >> 1), pqState: 0, num: null, keys: null }, a.e.fromInt(a.eInt), a } , v.rsa.stepKeyPairGenerationState = function(e, t) { "algorithm"in e || (e.algorithm = "PRIMEINC"); var r = new h(null); r.fromInt(30); for (var a, n = 0, i = function(e, t) { return e | t }, s = +new Date, c = 0; null === e.keys && (t <= 0 || c < t); ) { if (0 === e.state) { var u = null === e.p ? e.pBits : e.qBits , l = u - 1; 0 === e.pqState ? (e.num = new h(u,e.rng), e.num.testBit(l) || e.num.bitwiseTo(h.ONE.shiftLeft(l), i, e.num), e.num.dAddOffset(31 - e.num.mod(r).byteValue(), 0), n = 0, ++e.pqState) : 1 === e.pqState ? e.num.bitLength() > u ? e.pqState = 0 : e.num.isProbablePrime(o(e.num.bitLength())) ? ++e.pqState : e.num.dAddOffset(m[n++ % 8], 0) : 2 === e.pqState ? e.pqState = 0 === e.num.subtract(h.ONE).gcd(e.e).compareTo(h.ONE) ? 3 : 0 : 3 === e.pqState && (e.pqState = 0, null === e.p ? e.p = e.num : e.q = e.num, null !== e.p && null !== e.q && ++e.state, e.num = null) } else if (1 === e.state) e.p.compareTo(e.q) < 0 && (e.num = e.p, e.p = e.q, e.q = e.num), ++e.state; else if (2 === e.state) e.p1 = e.p.subtract(h.ONE), e.q1 = e.q.subtract(h.ONE), e.phi = e.p1.multiply(e.q1), ++e.state; else if (3 === e.state) 0 === e.phi.gcd(e.e).compareTo(h.ONE) ? ++e.state : (e.p = null, e.q = null, e.state = 0); else if (4 === e.state) e.n = e.p.multiply(e.q), e.n.bitLength() === e.bits ? ++e.state : (e.q = null, e.state = 0); else if (5 === e.state) { var p = e.e.modInverse(e.phi); e.keys = { privateKey: v.rsa.setPrivateKey(e.n, e.e, p, e.p, e.q, p.mod(e.p1), p.mod(e.q1), e.q.modInverse(e.p)), publicKey: v.rsa.setPublicKey(e.n, e.e) } } a = +new Date, c += a - s, s = a } return null !== e.keys } , v.rsa.generateKeyPair = function(e, t, r, a) { if (1 === arguments.length ? "object" == typeof e ? (r = e, e = void 0) : "function" == typeof e && (a = e, e = void 0) : 2 === arguments.length ? "number" == typeof e ? "function" == typeof t ? (a = t, t = void 0) : "number" != typeof t && (r = t, t = void 0) : (r = e, a = t, e = void 0, t = void 0) : 3 === arguments.length && ("number" == typeof t ? "function" == typeof r && (a = r, r = void 0) : (a = r, r = t, t = void 0)), r = r || {}, void 0 === e && (e = r.bits || 2048), void 0 === t && (t = r.e || 65537), !f.options.usePureJavaScript && !r.prng && e >= 256 && e <= 16384 && (65537 === t || 3 === t)) if (a) { if (c("generateKeyPair")) return d.generateKeyPair("rsa", { modulusLength: e, publicExponent: t, publicKeyEncoding: { type: "spki", format: "pem" }, privateKeyEncoding: { type: "pkcs8", format: "pem" } }, function(e, t, r) { if (e) return a(e); a(null, { privateKey: v.privateKeyFromPem(r), publicKey: v.publicKeyFromPem(t) }) }); if (u("generateKey") && u("exportKey")) return g.globalScope.crypto.subtle.generateKey({ name: "RSASSA-PKCS1-v1_5", modulusLength: e, publicExponent: p(t), hash: { name: "SHA-256" } }, !0, ["sign", "verify"]).then(function(e) { return g.globalScope.crypto.subtle.exportKey("pkcs8", e.privateKey) }).then(void 0, function(e) { a(e) }).then(function(e) { if (e) { var t = v.privateKeyFromAsn1(y.fromDer(f.util.createBuffer(e))); a(null, { privateKey: t, publicKey: v.setRsaPublicKey(t.n, t.e) }) } }); if (l("generateKey") && l("exportKey")) { var n = g.globalScope.msCrypto.subtle.generateKey({ name: "RSASSA-PKCS1-v1_5", modulusLength: e, publicExponent: p(t), hash: { name: "SHA-256" } }, !0, ["sign", "verify"]); return n.oncomplete = function(e) { var t = e.target.result , r = g.globalScope.msCrypto.subtle.exportKey("pkcs8", t.privateKey); r.oncomplete = function(e) { var t = e.target.result , r = v.privateKeyFromAsn1(y.fromDer(f.util.createBuffer(t))); a(null, { privateKey: r, publicKey: v.setRsaPublicKey(r.n, r.e) }) } , r.onerror = function(e) { a(e) } } , void (n.onerror = function(e) { a(e) } ) } } else if (c("generateKeyPairSync")) { var s = d.generateKeyPairSync("rsa", { modulusLength: e, publicExponent: t, publicKeyEncoding: { type: "spki", format: "pem" }, privateKeyEncoding: { type: "pkcs8", format: "pem" } }); return { privateKey: v.privateKeyFromPem(s.privateKey), publicKey: v.publicKeyFromPem(s.publicKey) } } var o = v.rsa.createKeyPairGenerationState(e, t, r); if (!a) return v.rsa.stepKeyPairGenerationState(o, 0), o.keys; i(o, r, a) } , v.setRsaPublicKey = v.rsa.setPublicKey = function(e, t) { var r = { n: e, e: t }; return r.encrypt = function(e, t, n) { if ("string" == typeof t ? t = t.toUpperCase() : void 0 === t && (t = "RSAES-PKCS1-V1_5"), "RSAES-PKCS1-V1_5" === t) t = { encode: function(e, t, r) { return a(e, t, 2).getBytes() } }; else if ("RSA-OAEP" === t || "RSAES-OAEP" === t) t = { encode: function(e, t) { return f.pkcs1.encode_rsa_oaep(t, e, n) } }; else if (-1 !== ["RAW", "NONE", "NULL", null].indexOf(t)) t = { encode: function(e) { return e } }; else if ("string" == typeof t) throw new Error('Unsupported encryption scheme: "' + t + '".'); var i = t.encode(e, r, !0); return v.rsa.encrypt(i, r, !0) } , r.verify = function(e, t, a) { "string" == typeof a ? a = a.toUpperCase() : void 0 === a && (a = "RSASSA-PKCS1-V1_5"), "RSASSA-PKCS1-V1_5" === a ? a = { verify: function(e, t) { return t = n(t, r, !0), e === y.fromDer(t).value[1].value } } : "NONE" !== a && "NULL" !== a && null !== a || (a = { verify: function(e, t) { return t = n(t, r, !0), e === t } }); var i = v.rsa.decrypt(t, r, !0, !1); return a.verify(e, i, r.n.bitLength()) } , r } , v.setRsaPrivateKey = v.rsa.setPrivateKey = function(e, t, r, a, i, s, o, c) { var u = { n: e, e: t, d: r, p: a, q: i, dP: s, dQ: o, qInv: c }; return u.decrypt = function(e, t, r) { "string" == typeof t ? t = t.toUpperCase() : void 0 === t && (t = "RSAES-PKCS1-V1_5"); var a = v.rsa.decrypt(e, u, !1, !1); if ("RSAES-PKCS1-V1_5" === t) t = { decode: n }; else if ("RSA-OAEP" === t || "RSAES-OAEP" === t) t = { decode: function(e, t) { return f.pkcs1.decode_rsa_oaep(t, e, r) } }; else { if (-1 === ["RAW", "NONE", "NULL", null].indexOf(t)) throw new Error('Unsupported encryption scheme: "' + t + '".'); t = { decode: function(e) { return e } } } return t.decode(a, u, !1) } , u.sign = function(e, t) { var r = !1; "string" == typeof t && (t = t.toUpperCase()), void 0 === t || "RSASSA-PKCS1-V1_5" === t ? (t = { encode: I }, r = 1) : "NONE" !== t && "NULL" !== t && null !== t || (t = { encode: function() { return e } }, r = 1); var a = t.encode(e, u.n.bitLength()); return v.rsa.encrypt(a, u, r) } , u } , v.wrapRsaPrivateKey = function(e) { return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, y.integerToDer(0).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.OID, !1, y.oidToDer(v.oids.rsaEncryption).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.NULL, !1, "")]), y.create(y.Class.UNIVERSAL, y.Type.OCTETSTRING, !1, y.toDer(e).getBytes())]) } , v.privateKeyFromAsn1 = function(e) { var t = {} , r = []; if (y.validate(e, C, t, r) && (e = y.fromDer(f.util.createBuffer(t.privateKey))), t = {}, r = [], !y.validate(e, E, t, r)) { var a = new Error("Cannot read private key. ASN.1 object does not contain an RSAPrivateKey."); throw a.errors = r, a } var n, i, s, o, c, u, l, p; return n = f.util.createBuffer(t.privateKeyModulus).toHex(), i = f.util.createBuffer(t.privateKeyPublicExponent).toHex(), s = f.util.createBuffer(t.privateKeyPrivateExponent).toHex(), o = f.util.createBuffer(t.privateKeyPrime1).toHex(), c = f.util.createBuffer(t.privateKeyPrime2).toHex(), u = f.util.createBuffer(t.privateKeyExponent1).toHex(), l = f.util.createBuffer(t.privateKeyExponent2).toHex(), p = f.util.createBuffer(t.privateKeyCoefficient).toHex(), v.setRsaPrivateKey(new h(n,16), new h(i,16), new h(s,16), new h(o,16), new h(c,16), new h(u,16), new h(l,16), new h(p,16)) } , v.privateKeyToAsn1 = v.privateKeyToRSAPrivateKey = function(e) { return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, y.integerToDer(0).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.n)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.e)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.d)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.p)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.q)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.dP)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.dQ)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.qInv))]) } , v.publicKeyFromAsn1 = function(e) { var t = {} , r = []; if (y.validate(e, T, t, r)) { var a = y.derToOid(t.publicKeyOid); if (a !== v.oids.rsaEncryption) { var n = new Error("Cannot read public key. Unknown OID."); throw n.oid = a, n } e = t.rsaPublicKey } if (r = [], !y.validate(e, S, t, r)) { var n = new Error("Cannot read public key. ASN.1 object does not contain an RSAPublicKey."); throw n.errors = r, n } var i = f.util.createBuffer(t.publicKeyModulus).toHex() , s = f.util.createBuffer(t.publicKeyExponent).toHex(); return v.setRsaPublicKey(new h(i,16), new h(s,16)) } , v.publicKeyToAsn1 = v.publicKeyToSubjectPublicKeyInfo = function(e) { return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.OID, !1, y.oidToDer(v.oids.rsaEncryption).getBytes()), y.create(y.Class.UNIVERSAL, y.Type.NULL, !1, "")]), y.create(y.Class.UNIVERSAL, y.Type.BITSTRING, !1, [v.publicKeyToRSAPublicKey(e)])]) } , v.publicKeyToRSAPublicKey = function(e) { return y.create(y.Class.UNIVERSAL, y.Type.SEQUENCE, !0, [y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.n)), y.create(y.Class.UNIVERSAL, y.Type.INTEGER, !1, s(e.e))]) } } , function(e, t, r) { function a(e, t, r) { this.data = [], null != e && ("number" == typeof e ? this.fromNumber(e, t, r) : null == t && "string" != typeof e ? this.fromString(e, 256) : this.fromString(e, t)) } function n() { return new a(null) } function i(e, t, r, a, n, i) { for (; --i >= 0; ) { var s = t * this.data[e++] + r.data[a] + n; n = Math.floor(s / 67108864), r.data[a++] = 67108863 & s } return n } function s(e, t, r, a, n, i) { for (var s = 32767 & t, o = t >> 15; --i >= 0; ) { var c = 32767 & this.data[e] , u = this.data[e++] >> 15 , l = o * c + u * s; c = s * c + ((32767 & l) << 15) + r.data[a] + (1073741823 & n), n = (c >>> 30) + (l >>> 15) + o * u + (n >>> 30), r.data[a++] = 1073741823 & c } return n } function o(e, t, r, a, n, i) { for (var s = 16383 & t, o = t >> 14; --i >= 0; ) { var c = 16383 & this.data[e] , u = this.data[e++] >> 14 , l = o * c + u * s; c = s * c + ((16383 & l) << 14) + r.data[a] + n, n = (c >> 28) + (l >> 14) + o * u, r.data[a++] = 268435455 & c } return n } function c(e) { return it.charAt(e) } function u(e, t) { var r = st[e.charCodeAt(t)]; return null == r ? -1 : r } function l(e) { for (var t = this.t - 1; t >= 0; --t) e.data[t] = this.data[t]; e.t = this.t, e.s = this.s } function p(e) { this.t = 1, this.s = e < 0 ? -1 : 0, e > 0 ? this.data[0] = e : e < -1 ? this.data[0] = e + this.DV : this.t = 0 } function f(e) { var t = n(); return t.fromInt(e), t } function h(e, t) { var r; if (16 == t) r = 4; else if (8 == t) r = 3; else if (256 == t) r = 8; else if (2 == t) r = 1; else if (32 == t) r = 5; else { if (4 != t) return void this.fromRadix(e, t); r = 2 } this.t = 0, this.s = 0; for (var n = e.length, i = !1, s = 0; --n >= 0; ) { var o = 8 == r ? 255 & e[n] : u(e, n); o < 0 ? "-" == e.charAt(n) && (i = !0) : (i = !1, 0 == s ? this.data[this.t++] = o : s + r > this.DB ? (this.data[this.t - 1] |= (o & (1 << this.DB - s) - 1) << s, this.data[this.t++] = o >> this.DB - s) : this.data[this.t - 1] |= o << s, (s += r) >= this.DB && (s -= this.DB)) } 8 == r && 0 != (128 & e[0]) && (this.s = -1, s > 0 && (this.data[this.t - 1] |= (1 << this.DB - s) - 1 << s)), this.clamp(), i && a.ZERO.subTo(this, this) } function d() { for (var e = this.s & this.DM; this.t > 0 && this.data[this.t - 1] == e; ) --this.t } function y(e) { if (this.s < 0) return "-" + this.negate().toString(e); var t; if (16 == e) t = 4; else if (8 == e) t = 3; else if (2 == e) t = 1; else if (32 == e) t = 5; else { if (4 != e) return this.toRadix(e); t = 2 } var r, a = (1 << t) - 1, n = !1, i = "", s = this.t, o = this.DB - s * this.DB % t; if (s-- > 0) for (o < this.DB && (r = this.data[s] >> o) > 0 && (n = !0, i = c(r)); s >= 0; ) o < t ? (r = (this.data[s] & (1 << o) - 1) << t - o, r |= this.data[--s] >> (o += this.DB - t)) : (r = this.data[s] >> (o -= t) & a, o <= 0 && (o += this.DB, --s)), r > 0 && (n = !0), n && (i += c(r)); return n ? i : "0" } function g() { var e = n(); return a.ZERO.subTo(this, e), e } function v() { return this.s < 0 ? this.negate() : this } function m(e) { var t = this.s - e.s; if (0 != t) return t; var r = this.t; if (0 != (t = r - e.t)) return this.s < 0 ? -t : t; for (; --r >= 0; ) if (0 != (t = this.data[r] - e.data[r])) return t; return 0 } function C(e) { var t, r = 1; return 0 != (t = e >>> 16) && (e = t, r += 16), 0 != (t = e >> 8) && (e = t, r += 8), 0 != (t = e >> 4) && (e = t, r += 4), 0 != (t = e >> 2) && (e = t, r += 2), 0 != (t = e >> 1) && (e = t, r += 1), r } function E() { return this.t <= 0 ? 0 : this.DB * (this.t - 1) + C(this.data[this.t - 1] ^ this.s & this.DM) } function S(e, t) { var r; for (r = this.t - 1; r >= 0; --r) t.data[r + e] = this.data[r]; for (r = e - 1; r >= 0; --r) t.data[r] = 0; t.t = this.t + e, t.s = this.s } function T(e, t) { for (var r = e; r < this.t; ++r) t.data[r - e] = this.data[r]; t.t = Math.max(this.t - e, 0), t.s = this.s } function I(e, t) { var r, a = e % this.DB, n = this.DB - a, i = (1 << n) - 1, s = Math.floor(e / this.DB), o = this.s << a & this.DM; for (r = this.t - 1; r >= 0; --r) t.data[r + s + 1] = this.data[r] >> n | o, o = (this.data[r] & i) << a; for (r = s - 1; r >= 0; --r) t.data[r] = 0; t.data[s] = o, t.t = this.t + s + 1, t.s = this.s, t.clamp() } function b(e, t) { t.s = this.s; var r = Math.floor(e / this.DB); if (r >= this.t) return void (t.t = 0); var a = e % this.DB , n = this.DB - a , i = (1 << a) - 1; t.data[0] = this.data[r] >> a; for (var s = r + 1; s < this.t; ++s) t.data[s - r - 1] |= (this.data[s] & i) << n, t.data[s - r] = this.data[s] >> a; a > 0 && (t.data[this.t - r - 1] |= (this.s & i) << n), t.t = this.t - r, t.clamp() } function A(e, t) { for (var r = 0, a = 0, n = Math.min(e.t, this.t); r < n; ) a += this.data[r] - e.data[r], t.data[r++] = a & this.DM, a >>= this.DB; if (e.t < this.t) { for (a -= e.s; r < this.t; ) a += this.data[r], t.data[r++] = a & this.DM, a >>= this.DB; a += this.s } else { for (a += this.s; r < e.t; ) a -= e.data[r], t.data[r++] = a & this.DM, a >>= this.DB; a -= e.s } t.s = a < 0 ? -1 : 0, a < -1 ? t.data[r++] = this.DV + a : a > 0 && (t.data[r++] = a), t.t = r, t.clamp() } function B(e, t) { var r = this.abs() , n = e.abs() , i = r.t; for (t.t = i + n.t; --i >= 0; ) t.data[i] = 0; for (i = 0; i < n.t; ++i) t.data[i + r.t] = r.am(0, n.data[i], t, i, 0, r.t); t.s = 0, t.clamp(), this.s != e.s && a.ZERO.subTo(t, t) } function N(e) { for (var t = this.abs(), r = e.t = 2 * t.t; --r >= 0; ) e.data[r] = 0; for (r = 0; r < t.t - 1; ++r) { var a = t.am(r, t.data[r], e, 2 * r, 0, 1); (e.data[r + t.t] += t.am(r + 1, 2 * t.data[r], e, 2 * r + 1, a, t.t - r - 1)) >= t.DV && (e.data[r + t.t] -= t.DV, e.data[r + t.t + 1] = 1) } e.t > 0 && (e.data[e.t - 1] += t.am(r, t.data[r], e, 2 * r, 0, 1)), e.s = 0, e.clamp() } function k(e, t, r) { var i = e.abs(); if (!(i.t <= 0)) { var s = this.abs(); if (s.t < i.t) return null != t && t.fromInt(0), void (null != r && this.copyTo(r)); null == r && (r = n()); var o = n() , c = this.s , u = e.s , l = this.DB - C(i.data[i.t - 1]); l > 0 ? (i.lShiftTo(l, o), s.lShiftTo(l, r)) : (i.copyTo(o), s.copyTo(r)); var p = o.t , f = o.data[p - 1]; if (0 != f) { var h = f * (1 << this.F1) + (p > 1 ? o.data[p - 2] >> this.F2 : 0) , d = this.FV / h , y = (1 << this.F1) / h , g = 1 << this.F2 , v = r.t , m = v - p , E = null == t ? n() : t; for (o.dlShiftTo(m, E), r.compareTo(E) >= 0 && (r.data[r.t++] = 1, r.subTo(E, r)), a.ONE.dlShiftTo(p, E), E.subTo(o, o); o.t < p; ) o.data[o.t++] = 0; for (; --m >= 0; ) { var S = r.data[--v] == f ? this.DM : Math.floor(r.data[v] * d + (r.data[v - 1] + g) * y); if ((r.data[v] += o.am(0, S, r, m, 0, p)) < S) for (o.dlShiftTo(m, E), r.subTo(E, r); r.data[v] < --S; ) r.subTo(E, r) } null != t && (r.drShiftTo(p, t), c != u && a.ZERO.subTo(t, t)), r.t = p, r.clamp(), l > 0 && r.rShiftTo(l, r), c < 0 && a.ZERO.subTo(r, r) } } } function w(e) { var t = n(); return this.abs().divRemTo(e, null, t), this.s < 0 && t.compareTo(a.ZERO) > 0 && e.subTo(t, t), t } function R(e) { this.m = e } function _(e) { return e.s < 0 || e.compareTo(this.m) >= 0 ? e.mod(this.m) : e } function L(e) { return e } function U(e) { e.divRemTo(this.m, null, e) } function D(e, t, r) { e.multiplyTo(t, r), this.reduce(r) } function P(e, t) { e.squareTo(t), this.reduce(t) } function V() { if (this.t < 1) return 0; var e = this.data[0]; if (0 == (1 & e)) return 0; var t = 3 & e; return t = t * (2 - (15 & e) * t) & 15, t = t * (2 - (255 & e) * t) & 255, t = t * (2 - ((65535 & e) * t & 65535)) & 65535, t = t * (2 - e * t % this.DV) % this.DV, t > 0 ? this.DV - t : -t } function O(e) { this.m = e, this.mp = e.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << e.DB - 15) - 1, this.mt2 = 2 * e.t } function K(e) { var t = n(); return e.abs().dlShiftTo(this.m.t, t), t.divRemTo(this.m, null, t), e.s < 0 && t.compareTo(a.ZERO) > 0 && this.m.subTo(t, t), t } function x(e) { var t = n(); return e.copyTo(t), this.reduce(t), t } function M(e) { for (; e.t <= this.mt2; ) e.data[e.t++] = 0; for (var t = 0; t < this.m.t; ++t) { var r = 32767 & e.data[t] , a = r * this.mpl + ((r * this.mph + (e.data[t] >> 15) * this.mpl & this.um) << 15) & e.DM; for (r = t + this.m.t, e.data[r] += this.m.am(0, a, e, t, 0, this.m.t); e.data[r] >= e.DV; ) e.data[r] -= e.DV, e.data[++r]++ } e.clamp(), e.drShiftTo(this.m.t, e), e.compareTo(this.m) >= 0 && e.subTo(this.m, e) } function F(e, t) { e.squareTo(t), this.reduce(t) } function q(e, t, r) { e.multiplyTo(t, r), this.reduce(r) } function j() { return 0 == (this.t > 0 ? 1 & this.data[0] : this.s) } function G(e, t) { if (e > 4294967295 || e < 1) return a.ONE; var r = n() , i = n() , s = t.convert(this) , o = C(e) - 1; for (s.copyTo(r); --o >= 0; ) if (t.sqrTo(r, i), (e & 1 << o) > 0) t.mulTo(i, s, r); else { var c = r; r = i, i = c } return t.revert(r) } function H(e, t) { var r; return r = e < 256 || t.isEven() ? new R(t) : new O(t), this.exp(e, r) } function Q() { var e = n(); return this.copyTo(e), e } function z() { if (this.s < 0) { if (1 == this.t) return this.data[0] - this.DV; if (0 == this.t) return -1 } else { if (1 == this.t) return this.data[0]; if (0 == this.t) return 0 } return (this.data[1] & (1 << 32 - this.DB) - 1) << this.DB | this.data[0] } function W() { return 0 == this.t ? this.s : this.data[0] << 24 >> 24 } function Y() { return 0 == this.t ? this.s : this.data[0] << 16 >> 16 } function X(e) { return Math.floor(Math.LN2 * this.DB / Math.log(e)) } function Z() { return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this.data[0] <= 0 ? 0 : 1 } function J(e) { if (null == e && (e = 10), 0 == this.signum() || e < 2 || e > 36) return "0"; var t = this.chunkSize(e) , r = Math.pow(e, t) , a = f(r) , i = n() , s = n() , o = ""; for (this.divRemTo(a, i, s); i.signum() > 0; ) o = (r + s.intValue()).toString(e).substr(1) + o, i.divRemTo(a, i, s); return s.intValue().toString(e) + o } function $(e, t) { this.fromInt(0), null == t && (t = 10); for (var r = this.chunkSize(t), n = Math.pow(t, r), i = !1, s = 0, o = 0, c = 0; c < e.length; ++c) { var l = u(e, c); l < 0 ? "-" == e.charAt(c) && 0 == this.signum() && (i = !0) : (o = t * o + l, ++s >= r && (this.dMultiply(n), this.dAddOffset(o, 0), s = 0, o = 0)) } s > 0 && (this.dMultiply(Math.pow(t, s)), this.dAddOffset(o, 0)), i && a.ZERO.subTo(this, this) } function ee(e, t, r) { if ("number" == typeof t) if (e < 2) this.fromInt(1); else for (this.fromNumber(e, r), this.testBit(e - 1) || this.bitwiseTo(a.ONE.shiftLeft(e - 1), ce, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(t); ) this.dAddOffset(2, 0), this.bitLength() > e && this.subTo(a.ONE.shiftLeft(e - 1), this); else { var n = new Array , i = 7 & e; n.length = 1 + (e >> 3), t.nextBytes(n), i > 0 ? n[0] &= (1 << i) - 1 : n[0] = 0, this.fromString(n, 256) } } function te() { var e = this.t , t = new Array; t[0] = this.s; var r, a = this.DB - e * this.DB % 8, n = 0; if (e-- > 0) for (a < this.DB && (r = this.data[e] >> a) != (this.s & this.DM) >> a && (t[n++] = r | this.s << this.DB - a); e >= 0; ) a < 8 ? (r = (this.data[e] & (1 << a) - 1) << 8 - a, r |= this.data[--e] >> (a += this.DB - 8)) : (r = this.data[e] >> (a -= 8) & 255, a <= 0 && (a += this.DB, --e)), 0 != (128 & r) && (r |= -256), 0 == n && (128 & this.s) != (128 & r) && ++n, (n > 0 || r != this.s) && (t[n++] = r); return t } function re(e) { return 0 == this.compareTo(e) } function ae(e) { return this.compareTo(e) < 0 ? this : e } function ne(e) { return this.compareTo(e) > 0 ? this : e } function ie(e, t, r) { var a, n, i = Math.min(e.t, this.t); for (a = 0; a < i; ++a) r.data[a] = t(this.data[a], e.data[a]); if (e.t < this.t) { for (n = e.s & this.DM, a = i; a < this.t; ++a) r.data[a] = t(this.data[a], n); r.t = this.t } else { for (n = this.s & this.DM, a = i; a < e.t; ++a) r.data[a] = t(n, e.data[a]); r.t = e.t } r.s = t(this.s, e.s), r.clamp() } function se(e, t) { return e & t } function oe(e) { var t = n(); return this.bitwiseTo(e, se, t), t } function ce(e, t) { return e | t } function ue(e) { var t = n(); return this.bitwiseTo(e, ce, t), t } function le(e, t) { return e ^ t } function pe(e) { var t = n(); return this.bitwiseTo(e, le, t), t } function fe(e, t) { return e & ~t } function he(e) { var t = n(); return this.bitwiseTo(e, fe, t), t } function de() { for (var e = n(), t = 0; t < this.t; ++t) e.data[t] = this.DM & ~this.data[t]; return e.t = this.t, e.s = ~this.s, e } function ye(e) { var t = n(); return e < 0 ? this.rShiftTo(-e, t) : this.lShiftTo(e, t), t } function ge(e) { var t = n(); return e < 0 ? this.lShiftTo(-e, t) : this.rShiftTo(e, t), t } function ve(e) { if (0 == e) return -1; var t = 0; return 0 == (65535 & e) && (e >>= 16, t += 16), 0 == (255 & e) && (e >>= 8, t += 8), 0 == (15 & e) && (e >>= 4, t += 4), 0 == (3 & e) && (e >>= 2, t += 2), 0 == (1 & e) && ++t, t } function me() { for (var e = 0; e < this.t; ++e) if (0 != this.data[e]) return e * this.DB + ve(this.data[e]); return this.s < 0 ? this.t * this.DB : -1 } function Ce(e) { for (var t = 0; 0 != e; ) e &= e - 1, ++t; return t } function Ee() { for (var e = 0, t = this.s & this.DM, r = 0; r < this.t; ++r) e += Ce(this.data[r] ^ t); return e } function Se(e) { var t = Math.floor(e / this.DB); return t >= this.t ? 0 != this.s : 0 != (this.data[t] & 1 << e % this.DB) } function Te(e, t) { var r = a.ONE.shiftLeft(e); return this.bitwiseTo(r, t, r), r } function Ie(e) { return this.changeBit(e, ce) } function be(e) { return this.changeBit(e, fe) } function Ae(e) { return this.changeBit(e, le) } function Be(e, t) { for (var r = 0, a = 0, n = Math.min(e.t, this.t); r < n; ) a += this.data[r] + e.data[r], t.data[r++] = a & this.DM, a >>= this.DB; if (e.t < this.t) { for (a += e.s; r < this.t; ) a += this.data[r], t.data[r++] = a & this.DM, a >>= this.DB; a += this.s } else { for (a += this.s; r < e.t; ) a += e.data[r], t.data[r++] = a & this.DM, a >>= this.DB; a += e.s } t.s = a < 0 ? -1 : 0, a > 0 ? t.data[r++] = a : a < -1 && (t.data[r++] = this.DV + a), t.t = r, t.clamp() } function Ne(e) { var t = n(); return this.addTo(e, t), t } function ke(e) { var t = n(); return this.subTo(e, t), t } function we(e) { var t = n(); return this.multiplyTo(e, t), t } function Re(e) { var t = n(); return this.divRemTo(e, t, null), t } function _e(e) { var t = n(); return this.divRemTo(e, null, t), t } function Le(e) { var t = n() , r = n(); return this.divRemTo(e, t, r), new Array(t,r) } function Ue(e) { this.data[this.t] = this.am(0, e - 1, this, 0, 0, this.t), ++this.t, this.clamp() } function De(e, t) { if (0 != e) { for (; this.t <= t; ) this.data[this.t++] = 0; for (this.data[t] += e; this.data[t] >= this.DV; ) this.data[t] -= this.DV, ++t >= this.t && (this.data[this.t++] = 0), ++this.data[t] } } function Pe() {} function Ve(e) { return e } function Oe(e, t, r) { e.multiplyTo(t, r) } function Ke(e, t) { e.squareTo(t) } function xe(e) { return this.exp(e, new Pe) } function Me(e, t, r) { var a = Math.min(this.t + e.t, t); for (r.s = 0, r.t = a; a > 0; ) r.data[--a] = 0; var n; for (n = r.t - this.t; a < n; ++a) r.data[a + this.t] = this.am(0, e.data[a], r, a, 0, this.t); for (n = Math.min(e.t, t); a < n; ++a) this.am(0, e.data[a], r, a, 0, t - a); r.clamp() } function Fe(e, t, r) { --t; var a = r.t = this.t + e.t - t; for (r.s = 0; --a >= 0; ) r.data[a] = 0; for (a = Math.max(t - this.t, 0); a < e.t; ++a) r.data[this.t + a - t] = this.am(t - a, e.data[a], r, 0, 0, this.t + a - t); r.clamp(), r.drShiftTo(1, r) } function qe(e) { this.r2 = n(), this.q3 = n(), a.ONE.dlShiftTo(2 * e.t, this.r2), this.mu = this.r2.divide(e), this.m = e } function je(e) { if (e.s < 0 || e.t > 2 * this.m.t) return e.mod(this.m); if (e.compareTo(this.m) < 0) return e; var t = n(); return e.copyTo(t), this.reduce(t), t } function Ge(e) { return e } function He(e) { for (e.drShiftTo(this.m.t - 1, this.r2), e.t > this.m.t + 1 && (e.t = this.m.t + 1, e.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); e.compareTo(this.r2) < 0; ) e.dAddOffset(1, this.m.t + 1); for (e.subTo(this.r2, e); e.compareTo(this.m) >= 0; ) e.subTo(this.m, e) } function Qe(e, t) { e.squareTo(t), this.reduce(t) } function ze(e, t, r) { e.multiplyTo(t, r), this.reduce(r) } function We(e, t) { var r, a, i = e.bitLength(), s = f(1); if (i <= 0) return s; r = i < 18 ? 1 : i < 48 ? 3 : i < 144 ? 4 : i < 768 ? 5 : 6, a = i < 8 ? new R(t) : t.isEven() ? new qe(t) : new O(t); var o = new Array , c = 3 , u = r - 1 , l = (1 << r) - 1; if (o[1] = a.convert(this), r > 1) { var p = n(); for (a.sqrTo(o[1], p); c <= l; ) o[c] = n(), a.mulTo(p, o[c - 2], o[c]), c += 2 } var h, d, y = e.t - 1, g = !0, v = n(); for (i = C(e.data[y]) - 1; y >= 0; ) { for (i >= u ? h = e.data[y] >> i - u & l : (h = (e.data[y] & (1 << i + 1) - 1) << u - i, y > 0 && (h |= e.data[y - 1] >> this.DB + i - u)), c = r; 0 == (1 & h); ) h >>= 1, --c; if ((i -= c) < 0 && (i += this.DB, --y), g) o[h].copyTo(s), g = !1; else { for (; c > 1; ) a.sqrTo(s, v), a.sqrTo(v, s), c -= 2; c > 0 ? a.sqrTo(s, v) : (d = s, s = v, v = d), a.mulTo(v, o[h], s) } for (; y >= 0 && 0 == (e.data[y] & 1 << i); ) a.sqrTo(s, v), d = s, s = v, v = d, --i < 0 && (i = this.DB - 1, --y) } return a.revert(s) } function Ye(e) { var t = this.s < 0 ? this.negate() : this.clone() , r = e.s < 0 ? e.negate() : e.clone(); if (t.compareTo(r) < 0) { var a = t; t = r, r = a } var n = t.getLowestSetBit() , i = r.getLowestSetBit(); if (i < 0) return t; for (n < i && (i = n), i > 0 && (t.rShiftTo(i, t), r.rShiftTo(i, r)); t.signum() > 0; ) (n = t.getLowestSetBit()) > 0 && t.rShiftTo(n, t), (n = r.getLowestSetBit()) > 0 && r.rShiftTo(n, r), t.compareTo(r) >= 0 ? (t.subTo(r, t), t.rShiftTo(1, t)) : (r.subTo(t, r), r.rShiftTo(1, r)); return i > 0 && r.lShiftTo(i, r), r } function Xe(e) { if (e <= 0) return 0; var t = this.DV % e , r = this.s < 0 ? e - 1 : 0; if (this.t > 0) if (0 == t) r = this.data[0] % e; else for (var a = this.t - 1; a >= 0; --a) r = (t * r + this.data[a]) % e; return r } function Ze(e) { var t = e.isEven(); if (this.isEven() && t || 0 == e.signum()) return a.ZERO; for (var r = e.clone(), n = this.clone(), i = f(1), s = f(0), o = f(0), c = f(1); 0 != r.signum(); ) { for (; r.isEven(); ) r.rShiftTo(1, r), t ? (i.isEven() && s.isEven() || (i.addTo(this, i), s.subTo(e, s)), i.rShiftTo(1, i)) : s.isEven() || s.subTo(e, s), s.rShiftTo(1, s); for (; n.isEven(); ) n.rShiftTo(1, n), t ? (o.isEven() && c.isEven() || (o.addTo(this, o), c.subTo(e, c)), o.rShiftTo(1, o)) : c.isEven() || c.subTo(e, c), c.rShiftTo(1, c); r.compareTo(n) >= 0 ? (r.subTo(n, r), t && i.subTo(o, i), s.subTo(c, s)) : (n.subTo(r, n), t && o.subTo(i, o), c.subTo(s, c)) } return 0 != n.compareTo(a.ONE) ? a.ZERO : c.compareTo(e) >= 0 ? c.subtract(e) : c.signum() < 0 ? (c.addTo(e, c), c.signum() < 0 ? c.add(e) : c) : c } function Je(e) { var t, r = this.abs(); if (1 == r.t && r.data[0] <= ot[ot.length - 1]) { for (t = 0; t < ot.length; ++t) if (r.data[0] == ot[t]) return !0; return !1 } if (r.isEven()) return !1; for (t = 1; t < ot.length; ) { for (var a = ot[t], n = t + 1; n < ot.length && a < ct; ) a *= ot[n++]; for (a = r.modInt(a); t < n; ) if (a % ot[t++] == 0) return !1 } return r.millerRabin(e) } function $e(e) { var t = this.subtract(a.ONE) , r = t.getLowestSetBit(); if (r <= 0) return !1; for (var n, i = t.shiftRight(r), s = et(), o = 0; o < e; ++o) { do { n = new a(this.bitLength(),s) } while (n.compareTo(a.ONE) <= 0 || n.compareTo(t) >= 0); var c = n.modPow(i, this); if (0 != c.compareTo(a.ONE) && 0 != c.compareTo(t)) { for (var u = 1; u++ < r && 0 != c.compareTo(t); ) if (c = c.modPowInt(2, this), 0 == c.compareTo(a.ONE)) return !1; if (0 != c.compareTo(t)) return !1 } } return !0 } function et() { return { nextBytes: function(e) { for (var t = 0; t < e.length; ++t) e[t] = Math.floor(256 * Math.random()) } } } var tt = r(0); e.exports = tt.jsbn = tt.jsbn || {}; var rt; tt.jsbn.BigInteger = a, "undefined" == typeof navigator ? (a.prototype.am = o, rt = 28) : "Microsoft Internet Explorer" == navigator.appName ? (a.prototype.am = s, rt = 30) : "Netscape" != navigator.appName ? (a.prototype.am = i, rt = 26) : (a.prototype.am = o, rt = 28), a.prototype.DB = rt, a.prototype.DM = (1 << rt) - 1, a.prototype.DV = 1 << rt; a.prototype.FV = Math.pow(2, 52), a.prototype.F1 = 52 - rt, a.prototype.F2 = 2 * rt - 52; var at, nt, it = "0123456789abcdefghijklmnopqrstuvwxyz", st = new Array; for (at = "0".charCodeAt(0), nt = 0; nt <= 9; ++nt) st[at++] = nt; for (at = "a".charCodeAt(0), nt = 10; nt < 36; ++nt) st[at++] = nt; for (at = "A".charCodeAt(0), nt = 10; nt < 36; ++nt) st[at++] = nt; R.prototype.convert = _, R.prototype.revert = L, R.prototype.reduce = U, R.prototype.mulTo = D, R.prototype.sqrTo = P, O.prototype.convert = K, O.prototype.revert = x, O.prototype.reduce = M, O.prototype.mulTo = q, O.prototype.sqrTo = F, a.prototype.copyTo = l, a.prototype.fromInt = p, a.prototype.fromString = h, a.prototype.clamp = d, a.prototype.dlShiftTo = S, a.prototype.drShiftTo = T, a.prototype.lShiftTo = I, a.prototype.rShiftTo = b, a.prototype.subTo = A, a.prototype.multiplyTo = B, a.prototype.squareTo = N, a.prototype.divRemTo = k, a.prototype.invDigit = V, a.prototype.isEven = j, a.prototype.exp = G, a.prototype.toString = y, a.prototype.negate = g, a.prototype.abs = v, a.prototype.compareTo = m, a.prototype.bitLength = E, a.prototype.mod = w, a.prototype.modPowInt = H, a.ZERO = f(0), a.ONE = f(1), Pe.prototype.convert = Ve, Pe.prototype.revert = Ve, Pe.prototype.mulTo = Oe, Pe.prototype.sqrTo = Ke, qe.prototype.convert = je, qe.prototype.revert = Ge, qe.prototype.reduce = He, qe.prototype.mulTo = ze, qe.prototype.sqrTo = Qe; var ot = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509] , ct = (1 << 26) / ot[ot.length - 1]; a.prototype.chunkSize = X, a.prototype.toRadix = J, a.prototype.fromRadix = $, a.prototype.fromNumber = ee, a.prototype.bitwiseTo = ie, a.prototype.changeBit = Te, a.prototype.addTo = Be, a.prototype.dMultiply = Ue, a.prototype.dAddOffset = De, a.prototype.multiplyLowerTo = Me, a.prototype.multiplyUpperTo = Fe, a.prototype.modInt = Xe, a.prototype.millerRabin = $e, a.prototype.clone = Q, a.prototype.intValue = z, a.prototype.byteValue = W, a.prototype.shortValue = Y, a.prototype.signum = Z, a.prototype.toByteArray = te, a.prototype.equals = re, a.prototype.min = ae, a.prototype.max = ne, a.prototype.and = oe, a.prototype.or = ue, a.prototype.xor = pe, a.prototype.andNot = he, a.prototype.not = de, a.prototype.shiftLeft = ye, a.prototype.shiftRight = ge, a.prototype.getLowestSetBit = me, a.prototype.bitCount = Ee, a.prototype.testBit = Se, a.prototype.setBit = Ie, a.prototype.clearBit = be, a.prototype.flipBit = Ae, a.prototype.add = Ne, a.prototype.subtract = ke, a.prototype.multiply = we, a.prototype.divide = Re, a.prototype.remainder = _e, a.prototype.divideAndRemainder = Le, a.prototype.modPow = We, a.prototype.modInverse = Ze, a.prototype.pow = xe, a.prototype.gcd = Ye, a.prototype.isProbablePrime = Je } , function(e, t, r) { var a = r(0); r(1), e.exports = a.cipher = a.cipher || {}, a.cipher.algorithms = a.cipher.algorithms || {}, a.cipher.createCipher = function(e, t) { var r = e; if ("string" == typeof r && (r = a.cipher.getAlgorithm(r)) && (r = r()), !r) throw new Error("Unsupported algorithm: " + e); return new a.cipher.BlockCipher({ algorithm: r, key: t, decrypt: !1 }) } , a.cipher.createDecipher = function(e, t) { var r = e; if ("string" == typeof r && (r = a.cipher.getAlgorithm(r)) && (r = r()), !r) throw new Error("Unsupported algorithm: " + e); return new a.cipher.BlockCipher({ algorithm: r, key: t, decrypt: !0 }) } , a.cipher.registerAlgorithm = function(e, t) { e = e.toUpperCase(), a.cipher.algorithms[e] = t } , a.cipher.getAlgorithm = function(e) { return e = e.toUpperCase(), e in a.cipher.algorithms ? a.cipher.algorithms[e] : null } ; var n = a.cipher.BlockCipher = function(e) { this.algorithm = e.algorithm, this.mode = this.algorithm.mode, this.blockSize = this.mode.blockSize, this._finish = !1, this._input = null, this.output = null, this._op = e.decrypt ? this.mode.decrypt : this.mode.encrypt, this._decrypt = e.decrypt, this.algorithm.initialize(e) } ; n.prototype.start = function(e) { e = e || {}; var t = {}; for (var r in e) t[r] = e[r]; t.decrypt = this._decrypt, this._finish = !1, this._input = a.util.createBuffer(), this.output = e.output || a.util.createBuffer(), this.mode.start(t) } , n.prototype.update = function(e) { for (e && this._input.putBuffer(e); !this._op.call(this.mode, this._input, this.output, this._finish) && !this._finish; ) ; this._input.compact() } , n.prototype.finish = function(e) { !e || "ECB" !== this.mode.name && "CBC" !== this.mode.name || (this.mode.pad = function(t) { return e(this.blockSize, t, !1) } , this.mode.unpad = function(t) { return e(this.blockSize, t, !0) } ); var t = {}; return t.decrypt = this._decrypt, t.overflow = this._input.length() % this.blockSize, !(!this._decrypt && this.mode.pad && !this.mode.pad(this._input, t)) && (this._finish = !0, this.update(), !(this._decrypt && this.mode.unpad && !this.mode.unpad(this.output, t)) && !(this.mode.afterFinish && !this.mode.afterFinish(this.output, t))) } } , function(e, t, r) { function a() { o = String.fromCharCode(128), o += i.util.fillString(String.fromCharCode(0), 64), c = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9], u = [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], l = new Array(64); for (var e = 0; e < 64; ++e) l[e] = Math.floor(4294967296 * Math.abs(Math.sin(e + 1))); p = !0 } function n(e, t, r) { for (var a, n, i, s, o, p, f, h, d = r.length(); d >= 64; ) { for (n = e.h0, i = e.h1, s = e.h2, o = e.h3, h = 0; h < 16; ++h) t[h] = r.getInt32Le(), p = o ^ i & (s ^ o), a = n + p + l[h] + t[h], f = u[h], n = o, o = s, s = i, i += a << f | a >>> 32 - f; for (; h < 32; ++h) p = s ^ o & (i ^ s), a = n + p + l[h] + t[c[h]], f = u[h], n = o, o = s, s = i, i += a << f | a >>> 32 - f; for (; h < 48; ++h) p = i ^ s ^ o, a = n + p + l[h] + t[c[h]], f = u[h], n = o, o = s, s = i, i += a << f | a >>> 32 - f; for (; h < 64; ++h) p = s ^ (i | ~o), a = n + p + l[h] + t[c[h]], f = u[h], n = o, o = s, s = i, i += a << f | a >>> 32 - f; e.h0 = e.h0 + n | 0, e.h1 = e.h1 + i | 0, e.h2 = e.h2 + s | 0, e.h3 = e.h3 + o | 0, d -= 64 } } var i = r(0); r(4), r(1); var s = e.exports = i.md5 = i.md5 || {}; i.md.md5 = i.md.algorithms.md5 = s, s.create = function() { p || a(); var e = null , t = i.util.createBuffer() , r = new Array(16) , s = { algorithm: "md5", blockLength: 64, digestLength: 16, messageLength: 0, fullMessageLength: null, messageLengthSize: 8 }; return s.start = function() { s.messageLength = 0, s.fullMessageLength = s.messageLength64 = []; for (var r = s.messageLengthSize / 4, a = 0; a < r; ++a) s.fullMessageLength.push(0); return t = i.util.createBuffer(), e = { h0: 1732584193, h1: 4023233417, h2: 2562383102, h3: 271733878 }, s } , s.start(), s.update = function(a, o) { "utf8" === o && (a = i.util.encodeUtf8(a)); var c = a.length; s.messageLength += c, c = [c / 4294967296 >>> 0, c >>> 0]; for (var u = s.fullMessageLength.length - 1; u >= 0; --u) s.fullMessageLength[u] += c[1], c[1] = c[0] + (s.fullMessageLength[u] / 4294967296 >>> 0), s.fullMessageLength[u] = s.fullMessageLength[u] >>> 0, c[0] = c[1] / 4294967296 >>> 0; return t.putBytes(a), n(e, r, t), (t.read > 2048 || 0 === t.length()) && t.compact(), s } , s.digest = function() { var a = i.util.createBuffer(); a.putBytes(t.bytes()); var c = s.fullMessageLength[s.fullMessageLength.length - 1] + s.messageLengthSize , u = c & s.blockLength - 1; a.putBytes(o.substr(0, s.blockLength - u)); for (var l, p = 0, f = s.fullMessageLength.length - 1; f >= 0; --f) l = 8 * s.fullMessageLength[f] + p, p = l / 4294967296 >>> 0, a.putInt32Le(l >>> 0); var h = { h0: e.h0, h1: e.h1, h2: e.h2, h3: e.h3 }; n(h, r, a); var d = i.util.createBuffer(); return d.putInt32Le(h.h0), d.putInt32Le(h.h1), d.putInt32Le(h.h2), d.putInt32Le(h.h3), d } , s } ; var o = null , c = null , u = null , l = null , p = !1 } , function(e, t, r) { var a = r(0); r(8), r(4), r(1); var n, i = a.pkcs5 = a.pkcs5 || {}; a.util.isNodejs && !a.options.usePureJavaScript && (n = r(16)), e.exports = a.pbkdf2 = i.pbkdf2 = function(e, t, r, i, s, o) { function c() { if (C > f) return o(null, m); d.start(null, null), d.update(t), d.update(a.util.int32ToBytes(C)), y = v = d.digest().getBytes(), E = 2, u() } function u() { if (E <= r) return d.start(null, null), d.update(v), g = d.digest().getBytes(), y = a.util.xorBytes(y, g, l), v = g, ++E, a.util.setImmediate(u); m += C < f ? y : y.substr(0, h), ++C, c() } if ("function" == typeof s && (o = s, s = null), a.util.isNodejs && !a.options.usePureJavaScript && n.pbkdf2 && (null === s || "object" != typeof s) && (n.pbkdf2Sync.length > 4 || !s || "sha1" === s)) return "string" != typeof s && (s = "sha1"), e = new Buffer(e,"binary"), t = new Buffer(t,"binary"), o ? 4 === n.pbkdf2Sync.length ? n.pbkdf2(e, t, r, i, function(e, t) { if (e) return o(e); o(null, t.toString("binary")) }) : n.pbkdf2(e, t, r, i, s, function(e, t) { if (e) return o(e); o(null, t.toString("binary")) }) : 4 === n.pbkdf2Sync.length ? n.pbkdf2Sync(e, t, r, i).toString("binary") : n.pbkdf2Sync(e, t, r, i, s).toString("binary"); if (void 0 !== s && null !== s || (s = "sha1"), "string" == typeof s) { if (!(s in a.md.algorithms)) throw new Error("Unknown hash algorithm: " + s); s = a.md[s].create() } var l = s.digestLength; if (i > 4294967295 * l) { var p = new Error("Derived key is too long."); if (o) return o(p); throw p } var f = Math.ceil(i / l) , h = i - (f - 1) * l , d = a.hmac.create(); d.start(s, e); var y, g, v, m = ""; if (!o) { for (var C = 1; C <= f; ++C) { d.start(null, null), d.update(t), d.update(a.util.int32ToBytes(C)), y = v = d.digest().getBytes(); for (var E = 2; E <= r; ++E) d.start(null, null), d.update(v), g = d.digest().getBytes(), y = a.util.xorBytes(y, g, l), v = g; m += C < f ? y : y.substr(0, h) } return m } var E, C = 1; c() } } , function(e, t) {} , function(e, t, r) { function a(e, t) { "string" == typeof t && (t = { shortName: t }); for (var r, a = null, n = 0; null === a && n < e.attributes.length; ++n) r = e.attributes[n], t.type && t.type === r.type ? a = r : t.name && t.name === r.name ? a = r : t.shortName && t.shortName === r.shortName && (a = r); return a } function n(e) { for (var t, r, a = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []), n = e.attributes, i = 0; i < n.length; ++i) { t = n[i]; var s = t.value , o = p.Type.PRINTABLESTRING; "valueTagClass"in t && (o = t.valueTagClass) === p.Type.UTF8 && (s = l.util.encodeUtf8(s)), r = p.create(p.Class.UNIVERSAL, p.Type.SET, !0, [p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.type).getBytes()), p.create(p.Class.UNIVERSAL, o, !1, s)])]), a.value.push(r) } return a } function i(e) { for (var t, r = 0; r < e.length; ++r) { if (t = e[r], void 0 === t.name && (t.type && t.type in f.oids ? t.name = f.oids[t.type] : t.shortName && t.shortName in d && (t.name = f.oids[d[t.shortName]])), void 0 === t.type) { if (!(t.name && t.name in f.oids)) { var a = new Error("Attribute type not specified."); throw a.attribute = t, a } t.type = f.oids[t.name] } if (void 0 === t.shortName && t.name && t.name in d && (t.shortName = d[t.name]), t.type === h.extensionRequest && (t.valueConstructed = !0, t.valueTagClass = p.Type.SEQUENCE, !t.value && t.extensions)) { t.value = []; for (var n = 0; n < t.extensions.length; ++n) t.value.push(f.certificateExtensionToAsn1(s(t.extensions[n]))) } if (void 0 === t.value) { var a = new Error("Attribute value not specified."); throw a.attribute = t, a } } } function s(e, t) { if (t = t || {}, void 0 === e.name && e.id && e.id in f.oids && (e.name = f.oids[e.id]), void 0 === e.id) { if (!(e.name && e.name in f.oids)) { var r = new Error("Extension ID not specified."); throw r.extension = e, r } e.id = f.oids[e.name] } if (void 0 !== e.value) return e; if ("keyUsage" === e.name) { var a = 0 , i = 0 , s = 0; e.digitalSignature && (i |= 128, a = 7), e.nonRepudiation && (i |= 64, a = 6), e.keyEncipherment && (i |= 32, a = 5), e.dataEncipherment && (i |= 16, a = 4), e.keyAgreement && (i |= 8, a = 3), e.keyCertSign && (i |= 4, a = 2), e.cRLSign && (i |= 2, a = 1), e.encipherOnly && (i |= 1, a = 0), e.decipherOnly && (s |= 128, a = 7); var o = String.fromCharCode(a); 0 !== s ? o += String.fromCharCode(i) + String.fromCharCode(s) : 0 !== i && (o += String.fromCharCode(i)), e.value = p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, o) } else if ("basicConstraints" === e.name) e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []), e.cA && e.value.value.push(p.create(p.Class.UNIVERSAL, p.Type.BOOLEAN, !1, String.fromCharCode(255))), "pathLenConstraint"in e && e.value.value.push(p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(e.pathLenConstraint).getBytes())); else if ("extKeyUsage" === e.name) { e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []); var c = e.value.value; for (var u in e) !0 === e[u] && (u in h ? c.push(p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(h[u]).getBytes())) : -1 !== u.indexOf(".") && c.push(p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(u).getBytes()))) } else if ("nsCertType" === e.name) { var a = 0 , i = 0; e.client && (i |= 128, a = 7), e.server && (i |= 64, a = 6), e.email && (i |= 32, a = 5), e.objsign && (i |= 16, a = 4), e.reserved && (i |= 8, a = 3), e.sslCA && (i |= 4, a = 2), e.emailCA && (i |= 2, a = 1), e.objCA && (i |= 1, a = 0); var o = String.fromCharCode(a); 0 !== i && (o += String.fromCharCode(i)), e.value = p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, o) } else if ("subjectAltName" === e.name || "issuerAltName" === e.name) { e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []); for (var d, y = 0; y < e.altNames.length; ++y) { d = e.altNames[y]; var o = d.value; if (7 === d.type && d.ip) { if (null === (o = l.util.bytesFromIP(d.ip))) { var r = new Error('Extension "ip" value is not a valid IPv4 or IPv6 address.'); throw r.extension = e, r } } else 8 === d.type && (o = d.oid ? p.oidToDer(p.oidToDer(d.oid)) : p.oidToDer(o)); e.value.value.push(p.create(p.Class.CONTEXT_SPECIFIC, d.type, !1, o)) } } else if ("nsComment" === e.name && t.cert) { if (!/^[\x00-\x7F]*$/.test(e.comment) || e.comment.length < 1 || e.comment.length > 128) throw new Error('Invalid "nsComment" content.'); e.value = p.create(p.Class.UNIVERSAL, p.Type.IA5STRING, !1, e.comment) } else if ("subjectKeyIdentifier" === e.name && t.cert) { var g = t.cert.generateSubjectKeyIdentifier(); e.subjectKeyIdentifier = g.toHex(), e.value = p.create(p.Class.UNIVERSAL, p.Type.OCTETSTRING, !1, g.getBytes()) } else if ("authorityKeyIdentifier" === e.name && t.cert) { e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []); var c = e.value.value; if (e.keyIdentifier) { var v = !0 === e.keyIdentifier ? t.cert.generateSubjectKeyIdentifier().getBytes() : e.keyIdentifier; c.push(p.create(p.Class.CONTEXT_SPECIFIC, 0, !1, v)) } if (e.authorityCertIssuer) { var m = [p.create(p.Class.CONTEXT_SPECIFIC, 4, !0, [n(!0 === e.authorityCertIssuer ? t.cert.issuer : e.authorityCertIssuer)])]; c.push(p.create(p.Class.CONTEXT_SPECIFIC, 1, !0, m)) } if (e.serialNumber) { var C = l.util.hexToBytes(!0 === e.serialNumber ? t.cert.serialNumber : e.serialNumber); c.push(p.create(p.Class.CONTEXT_SPECIFIC, 2, !1, C)) } } else if ("cRLDistributionPoints" === e.name) { e.value = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []); for (var d, c = e.value.value, E = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []), S = p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, []), y = 0; y < e.altNames.length; ++y) { d = e.altNames[y]; var o = d.value; if (7 === d.type && d.ip) { if (null === (o = l.util.bytesFromIP(d.ip))) { var r = new Error('Extension "ip" value is not a valid IPv4 or IPv6 address.'); throw r.extension = e, r } } else 8 === d.type && (o = d.oid ? p.oidToDer(p.oidToDer(d.oid)) : p.oidToDer(o)); S.value.push(p.create(p.Class.CONTEXT_SPECIFIC, d.type, !1, o)) } E.value.push(p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, [S])), c.push(E) } if (void 0 === e.value) { var r = new Error("Extension value not specified."); throw r.extension = e, r } return e } function o(e, t) { switch (e) { case h["RSASSA-PSS"]: var r = []; return void 0 !== t.hash.algorithmOid && r.push(p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, [p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.hash.algorithmOid).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.NULL, !1, "")])])), void 0 !== t.mgf.algorithmOid && r.push(p.create(p.Class.CONTEXT_SPECIFIC, 1, !0, [p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.mgf.algorithmOid).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(t.mgf.hash.algorithmOid).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.NULL, !1, "")])])])), void 0 !== t.saltLength && r.push(p.create(p.Class.CONTEXT_SPECIFIC, 2, !0, [p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(t.saltLength).getBytes())])), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, r); default: return p.create(p.Class.UNIVERSAL, p.Type.NULL, !1, "") } } function c(e) { var t = p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, []); if (0 === e.attributes.length) return t; for (var r = e.attributes, a = 0; a < r.length; ++a) { var n = r[a] , i = n.value , s = p.Type.UTF8; "valueTagClass"in n && (s = n.valueTagClass), s === p.Type.UTF8 && (i = l.util.encodeUtf8(i)); var o = !1; "valueConstructed"in n && (o = n.valueConstructed); var c = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(n.type).getBytes()), p.create(p.Class.UNIVERSAL, p.Type.SET, !0, [p.create(p.Class.UNIVERSAL, s, o, i)])]); t.value.push(c) } return t } function u(e) { return e >= S && e < T ? p.create(p.Class.UNIVERSAL, p.Type.UTCTIME, !1, p.dateToUtcTime(e)) : p.create(p.Class.UNIVERSAL, p.Type.GENERALIZEDTIME, !1, p.dateToGeneralizedTime(e)) } var l = r(0); r(5), r(3), r(10), r(4), r(39), r(6), r(7), r(18), r(11), r(1); var p = l.asn1 , f = e.exports = l.pki = l.pki || {} , h = f.oids , d = {}; d.CN = h.commonName, d.commonName = "CN", d.C = h.countryName, d.countryName = "C", d.L = h.localityName, d.localityName = "L", d.ST = h.stateOrProvinceName, d.stateOrProvinceName = "ST", d.O = h.organizationName, d.organizationName = "O", d.OU = h.organizationalUnitName, d.organizationalUnitName = "OU", d.E = h.emailAddress, d.emailAddress = "E"; var y = l.pki.rsa.publicKeyValidator , g = { name: "Certificate", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "Certificate.TBSCertificate", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, captureAsn1: "tbsCertificate", value: [{ name: "Certificate.TBSCertificate.version", tagClass: p.Class.CONTEXT_SPECIFIC, type: 0, constructed: !0, optional: !0, value: [{ name: "Certificate.TBSCertificate.version.integer", tagClass: p.Class.UNIVERSAL, type: p.Type.INTEGER, constructed: !1, capture: "certVersion" }] }, { name: "Certificate.TBSCertificate.serialNumber", tagClass: p.Class.UNIVERSAL, type: p.Type.INTEGER, constructed: !1, capture: "certSerialNumber" }, { name: "Certificate.TBSCertificate.signature", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "Certificate.TBSCertificate.signature.algorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1, capture: "certinfoSignatureOid" }, { name: "Certificate.TBSCertificate.signature.parameters", tagClass: p.Class.UNIVERSAL, optional: !0, captureAsn1: "certinfoSignatureParams" }] }, { name: "Certificate.TBSCertificate.issuer", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, captureAsn1: "certIssuer" }, { name: "Certificate.TBSCertificate.validity", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "Certificate.TBSCertificate.validity.notBefore (utc)", tagClass: p.Class.UNIVERSAL, type: p.Type.UTCTIME, constructed: !1, optional: !0, capture: "certValidity1UTCTime" }, { name: "Certificate.TBSCertificate.validity.notBefore (generalized)", tagClass: p.Class.UNIVERSAL, type: p.Type.GENERALIZEDTIME, constructed: !1, optional: !0, capture: "certValidity2GeneralizedTime" }, { name: "Certificate.TBSCertificate.validity.notAfter (utc)", tagClass: p.Class.UNIVERSAL, type: p.Type.UTCTIME, constructed: !1, optional: !0, capture: "certValidity3UTCTime" }, { name: "Certificate.TBSCertificate.validity.notAfter (generalized)", tagClass: p.Class.UNIVERSAL, type: p.Type.GENERALIZEDTIME, constructed: !1, optional: !0, capture: "certValidity4GeneralizedTime" }] }, { name: "Certificate.TBSCertificate.subject", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, captureAsn1: "certSubject" }, y, { name: "Certificate.TBSCertificate.issuerUniqueID", tagClass: p.Class.CONTEXT_SPECIFIC, type: 1, constructed: !0, optional: !0, value: [{ name: "Certificate.TBSCertificate.issuerUniqueID.id", tagClass: p.Class.UNIVERSAL, type: p.Type.BITSTRING, constructed: !1, captureBitStringValue: "certIssuerUniqueId" }] }, { name: "Certificate.TBSCertificate.subjectUniqueID", tagClass: p.Class.CONTEXT_SPECIFIC, type: 2, constructed: !0, optional: !0, value: [{ name: "Certificate.TBSCertificate.subjectUniqueID.id", tagClass: p.Class.UNIVERSAL, type: p.Type.BITSTRING, constructed: !1, captureBitStringValue: "certSubjectUniqueId" }] }, { name: "Certificate.TBSCertificate.extensions", tagClass: p.Class.CONTEXT_SPECIFIC, type: 3, constructed: !0, captureAsn1: "certExtensions", optional: !0 }] }, { name: "Certificate.signatureAlgorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "Certificate.signatureAlgorithm.algorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1, capture: "certSignatureOid" }, { name: "Certificate.TBSCertificate.signature.parameters", tagClass: p.Class.UNIVERSAL, optional: !0, captureAsn1: "certSignatureParams" }] }, { name: "Certificate.signatureValue", tagClass: p.Class.UNIVERSAL, type: p.Type.BITSTRING, constructed: !1, captureBitStringValue: "certSignature" }] } , v = { name: "rsapss", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "rsapss.hashAlgorithm", tagClass: p.Class.CONTEXT_SPECIFIC, type: 0, constructed: !0, value: [{ name: "rsapss.hashAlgorithm.AlgorithmIdentifier", tagClass: p.Class.UNIVERSAL, type: p.Class.SEQUENCE, constructed: !0, optional: !0, value: [{ name: "rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1, capture: "hashOid" }] }] }, { name: "rsapss.maskGenAlgorithm", tagClass: p.Class.CONTEXT_SPECIFIC, type: 1, constructed: !0, value: [{ name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier", tagClass: p.Class.UNIVERSAL, type: p.Class.SEQUENCE, constructed: !0, optional: !0, value: [{ name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1, capture: "maskGenOid" }, { name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1, capture: "maskGenHashOid" }] }] }] }, { name: "rsapss.saltLength", tagClass: p.Class.CONTEXT_SPECIFIC, type: 2, optional: !0, value: [{ name: "rsapss.saltLength.saltLength", tagClass: p.Class.UNIVERSAL, type: p.Class.INTEGER, constructed: !1, capture: "saltLength" }] }, { name: "rsapss.trailerField", tagClass: p.Class.CONTEXT_SPECIFIC, type: 3, optional: !0, value: [{ name: "rsapss.trailer.trailer", tagClass: p.Class.UNIVERSAL, type: p.Class.INTEGER, constructed: !1, capture: "trailer" }] }] } , m = { name: "CertificationRequestInfo", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, captureAsn1: "certificationRequestInfo", value: [{ name: "CertificationRequestInfo.integer", tagClass: p.Class.UNIVERSAL, type: p.Type.INTEGER, constructed: !1, capture: "certificationRequestInfoVersion" }, { name: "CertificationRequestInfo.subject", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, captureAsn1: "certificationRequestInfoSubject" }, y, { name: "CertificationRequestInfo.attributes", tagClass: p.Class.CONTEXT_SPECIFIC, type: 0, constructed: !0, optional: !0, capture: "certificationRequestInfoAttributes", value: [{ name: "CertificationRequestInfo.attributes", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "CertificationRequestInfo.attributes.type", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1 }, { name: "CertificationRequestInfo.attributes.value", tagClass: p.Class.UNIVERSAL, type: p.Type.SET, constructed: !0 }] }] }] } , C = { name: "CertificationRequest", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, captureAsn1: "csr", value: [m, { name: "CertificationRequest.signatureAlgorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.SEQUENCE, constructed: !0, value: [{ name: "CertificationRequest.signatureAlgorithm.algorithm", tagClass: p.Class.UNIVERSAL, type: p.Type.OID, constructed: !1, capture: "csrSignatureOid" }, { name: "CertificationRequest.signatureAlgorithm.parameters", tagClass: p.Class.UNIVERSAL, optional: !0, captureAsn1: "csrSignatureParams" }] }, { name: "CertificationRequest.signature", tagClass: p.Class.UNIVERSAL, type: p.Type.BITSTRING, constructed: !1, captureBitStringValue: "csrSignature" }] }; f.RDNAttributesAsArray = function(e, t) { for (var r, a, n, i = [], s = 0; s < e.value.length; ++s) { r = e.value[s]; for (var o = 0; o < r.value.length; ++o) n = {}, a = r.value[o], n.type = p.derToOid(a.value[0].value), n.value = a.value[1].value, n.valueTagClass = a.value[1].type, n.type in h && (n.name = h[n.type], n.name in d && (n.shortName = d[n.name])), t && (t.update(n.type), t.update(n.value)), i.push(n) } return i } , f.CRIAttributesAsArray = function(e) { for (var t = [], r = 0; r < e.length; ++r) for (var a = e[r], n = p.derToOid(a.value[0].value), i = a.value[1].value, s = 0; s < i.length; ++s) { var o = {}; if (o.type = n, o.value = i[s].value, o.valueTagClass = i[s].type, o.type in h && (o.name = h[o.type], o.name in d && (o.shortName = d[o.name])), o.type === h.extensionRequest) { o.extensions = []; for (var c = 0; c < o.value.length; ++c) o.extensions.push(f.certificateExtensionFromAsn1(o.value[c])) } t.push(o) } return t } ; var E = function(e, t, r) { var a = {}; if (e !== h["RSASSA-PSS"]) return a; r && (a = { hash: { algorithmOid: h.sha1 }, mgf: { algorithmOid: h.mgf1, hash: { algorithmOid: h.sha1 } }, saltLength: 20 }); var n = {} , i = []; if (!p.validate(t, v, n, i)) { var s = new Error("Cannot read RSASSA-PSS parameter block."); throw s.errors = i, s } return void 0 !== n.hashOid && (a.hash = a.hash || {}, a.hash.algorithmOid = p.derToOid(n.hashOid)), void 0 !== n.maskGenOid && (a.mgf = a.mgf || {}, a.mgf.algorithmOid = p.derToOid(n.maskGenOid), a.mgf.hash = a.mgf.hash || {}, a.mgf.hash.algorithmOid = p.derToOid(n.maskGenHashOid)), void 0 !== n.saltLength && (a.saltLength = n.saltLength.charCodeAt(0)), a }; f.certificateFromPem = function(e, t, r) { var a = l.pem.decode(e)[0]; if ("CERTIFICATE" !== a.type && "X509 CERTIFICATE" !== a.type && "TRUSTED CERTIFICATE" !== a.type) { var n = new Error('Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".'); throw n.headerType = a.type, n } if (a.procType && "ENCRYPTED" === a.procType.type) throw new Error("Could not convert certificate from PEM; PEM is encrypted."); var i = p.fromDer(a.body, r); return f.certificateFromAsn1(i, t) } , f.certificateToPem = function(e, t) { var r = { type: "CERTIFICATE", body: p.toDer(f.certificateToAsn1(e)).getBytes() }; return l.pem.encode(r, { maxline: t }) } , f.publicKeyFromPem = function(e) { var t = l.pem.decode(e)[0]; if ("PUBLIC KEY" !== t.type && "RSA PUBLIC KEY" !== t.type) { var r = new Error('Could not convert public key from PEM; PEM header type is not "PUBLIC KEY" or "RSA PUBLIC KEY".'); throw r.headerType = t.type, r } if (t.procType && "ENCRYPTED" === t.procType.type) throw new Error("Could not convert public key from PEM; PEM is encrypted."); var a = p.fromDer(t.body); return f.publicKeyFromAsn1(a) } , f.publicKeyToPem = function(e, t) { var r = { type: "PUBLIC KEY", body: p.toDer(f.publicKeyToAsn1(e)).getBytes() }; return l.pem.encode(r, { maxline: t }) } , f.publicKeyToRSAPublicKeyPem = function(e, t) { var r = { type: "RSA PUBLIC KEY", body: p.toDer(f.publicKeyToRSAPublicKey(e)).getBytes() }; return l.pem.encode(r, { maxline: t }) } , f.getPublicKeyFingerprint = function(e, t) { t = t || {}; var r, a = t.md || l.md.sha1.create(), n = t.type || "RSAPublicKey"; switch (n) { case "RSAPublicKey": r = p.toDer(f.publicKeyToRSAPublicKey(e)).getBytes(); break; case "SubjectPublicKeyInfo": r = p.toDer(f.publicKeyToAsn1(e)).getBytes(); break; default: throw new Error('Unknown fingerprint type "' + t.type + '".') } a.start(), a.update(r); var i = a.digest(); if ("hex" === t.encoding) { var s = i.toHex(); return t.delimiter ? s.match(/.{2}/g).join(t.delimiter) : s } if ("binary" === t.encoding) return i.getBytes(); if (t.encoding) throw new Error('Unknown encoding "' + t.encoding + '".'); return i } , f.certificationRequestFromPem = function(e, t, r) { var a = l.pem.decode(e)[0]; if ("CERTIFICATE REQUEST" !== a.type) { var n = new Error('Could not convert certification request from PEM; PEM header type is not "CERTIFICATE REQUEST".'); throw n.headerType = a.type, n } if (a.procType && "ENCRYPTED" === a.procType.type) throw new Error("Could not convert certification request from PEM; PEM is encrypted."); var i = p.fromDer(a.body, r); return f.certificationRequestFromAsn1(i, t) } , f.certificationRequestToPem = function(e, t) { var r = { type: "CERTIFICATE REQUEST", body: p.toDer(f.certificationRequestToAsn1(e)).getBytes() }; return l.pem.encode(r, { maxline: t }) } , f.createCertificate = function() { var e = {}; return e.version = 2, e.serialNumber = "00", e.signatureOid = null, e.signature = null, e.siginfo = {}, e.siginfo.algorithmOid = null, e.validity = {}, e.validity.notBefore = new Date, e.validity.notAfter = new Date, e.issuer = {}, e.issuer.getField = function(t) { return a(e.issuer, t) } , e.issuer.addField = function(t) { i([t]), e.issuer.attributes.push(t) } , e.issuer.attributes = [], e.issuer.hash = null, e.subject = {}, e.subject.getField = function(t) { return a(e.subject, t) } , e.subject.addField = function(t) { i([t]), e.subject.attributes.push(t) } , e.subject.attributes = [], e.subject.hash = null, e.extensions = [], e.publicKey = null, e.md = null, e.setSubject = function(t, r) { i(t), e.subject.attributes = t, delete e.subject.uniqueId, r && (e.subject.uniqueId = r), e.subject.hash = null } , e.setIssuer = function(t, r) { i(t), e.issuer.attributes = t, delete e.issuer.uniqueId, r && (e.issuer.uniqueId = r), e.issuer.hash = null } , e.setExtensions = function(t) { for (var r = 0; r < t.length; ++r) s(t[r], { cert: e }); e.extensions = t } , e.getExtension = function(t) { "string" == typeof t && (t = { name: t }); for (var r, a = null, n = 0; null === a && n < e.extensions.length; ++n) r = e.extensions[n], t.id && r.id === t.id ? a = r : t.name && r.name === t.name && (a = r); return a } , e.sign = function(t, r) { e.md = r || l.md.sha1.create(); var a = h[e.md.algorithm + "WithRSAEncryption"]; if (!a) { var n = new Error("Could not compute certificate digest. Unknown message digest algorithm OID."); throw n.algorithm = e.md.algorithm, n } e.signatureOid = e.siginfo.algorithmOid = a, e.tbsCertificate = f.getTBSCertificate(e); var i = p.toDer(e.tbsCertificate); e.md.update(i.getBytes()), e.signature = t.sign(e.md) } , e.verify = function(t) { var r = !1; if (!e.issued(t)) { var a = t.issuer , n = e.subject , i = new Error("The parent certificate did not issue the given child certificate; the child certificate's issuer does not match the parent's subject."); throw i.expectedIssuer = a.attributes, i.actualIssuer = n.attributes, i } var s = t.md; if (null === s) { if (t.signatureOid in h) { switch (h[t.signatureOid]) { case "sha1WithRSAEncryption": s = l.md.sha1.create(); break; case "md5WithRSAEncryption": s = l.md.md5.create(); break; case "sha256WithRSAEncryption": s = l.md.sha256.create(); break; case "sha384WithRSAEncryption": s = l.md.sha384.create(); break; case "sha512WithRSAEncryption": s = l.md.sha512.create(); break; case "RSASSA-PSS": s = l.md.sha256.create() } } if (null === s) { var i = new Error("Could not compute certificate digest. Unknown signature OID."); throw i.signatureOid = t.signatureOid, i } var o = t.tbsCertificate || f.getTBSCertificate(t) , c = p.toDer(o); s.update(c.getBytes()) } if (null !== s) { var u; switch (t.signatureOid) { case h.sha1WithRSAEncryption: u = void 0; break; case h["RSASSA-PSS"]: var d, y; if (void 0 === (d = h[t.signatureParameters.mgf.hash.algorithmOid]) || void 0 === l.md[d]) { var i = new Error("Unsupported MGF hash function."); throw i.oid = t.signatureParameters.mgf.hash.algorithmOid, i.name = d, i } if (void 0 === (y = h[t.signatureParameters.mgf.algorithmOid]) || void 0 === l.mgf[y]) { var i = new Error("Unsupported MGF function."); throw i.oid = t.signatureParameters.mgf.algorithmOid, i.name = y, i } if (y = l.mgf[y].create(l.md[d].create()), void 0 === (d = h[t.signatureParameters.hash.algorithmOid]) || void 0 === l.md[d]) throw { message: "Unsupported RSASSA-PSS hash function.", oid: t.signatureParameters.hash.algorithmOid, name: d }; u = l.pss.create(l.md[d].create(), y, t.signatureParameters.saltLength) } r = e.publicKey.verify(s.digest().getBytes(), t.signature, u) } return r } , e.isIssuer = function(t) { var r = !1 , a = e.issuer , n = t.subject; if (a.hash && n.hash) r = a.hash === n.hash; else if (a.attributes.length === n.attributes.length) { r = !0; for (var i, s, o = 0; r && o < a.attributes.length; ++o) i = a.attributes[o], s = n.attributes[o], i.type === s.type && i.value === s.value || (r = !1) } return r } , e.issued = function(t) { return t.isIssuer(e) } , e.generateSubjectKeyIdentifier = function() { return f.getPublicKeyFingerprint(e.publicKey, { type: "RSAPublicKey" }) } , e.verifySubjectKeyIdentifier = function() { for (var t = h.subjectKeyIdentifier, r = 0; r < e.extensions.length; ++r) { var a = e.extensions[r]; if (a.id === t) { var n = e.generateSubjectKeyIdentifier().getBytes(); return l.util.hexToBytes(a.subjectKeyIdentifier) === n } } return !1 } , e } , f.certificateFromAsn1 = function(e, t) { var r = {} , n = []; if (!p.validate(e, g, r, n)) { var s = new Error("Cannot read X.509 certificate. ASN.1 object is not an X509v3 Certificate."); throw s.errors = n, s } var o = p.derToOid(r.publicKeyOid); if (o !== f.oids.rsaEncryption) throw new Error("Cannot read public key. OID is not RSA."); var c = f.createCertificate(); c.version = r.certVersion ? r.certVersion.charCodeAt(0) : 0; var u = l.util.createBuffer(r.certSerialNumber); c.serialNumber = u.toHex(), c.signatureOid = l.asn1.derToOid(r.certSignatureOid), c.signatureParameters = E(c.signatureOid, r.certSignatureParams, !0), c.siginfo.algorithmOid = l.asn1.derToOid(r.certinfoSignatureOid), c.siginfo.parameters = E(c.siginfo.algorithmOid, r.certinfoSignatureParams, !1), c.signature = r.certSignature; var d = []; if (void 0 !== r.certValidity1UTCTime && d.push(p.utcTimeToDate(r.certValidity1UTCTime)), void 0 !== r.certValidity2GeneralizedTime && d.push(p.generalizedTimeToDate(r.certValidity2GeneralizedTime)), void 0 !== r.certValidity3UTCTime && d.push(p.utcTimeToDate(r.certValidity3UTCTime)), void 0 !== r.certValidity4GeneralizedTime && d.push(p.generalizedTimeToDate(r.certValidity4GeneralizedTime)), d.length > 2) throw new Error("Cannot read notBefore/notAfter validity times; more than two times were provided in the certificate."); if (d.length < 2) throw new Error("Cannot read notBefore/notAfter validity times; they were not provided as either UTCTime or GeneralizedTime."); if (c.validity.notBefore = d[0], c.validity.notAfter = d[1], c.tbsCertificate = r.tbsCertificate, t) { if (c.md = null, c.signatureOid in h) { var o = h[c.signatureOid]; switch (o) { case "sha1WithRSAEncryption": c.md = l.md.sha1.create(); break; case "md5WithRSAEncryption": c.md = l.md.md5.create(); break; case "sha256WithRSAEncryption": c.md = l.md.sha256.create(); break; case "sha384WithRSAEncryption": c.md = l.md.sha384.create(); break; case "sha512WithRSAEncryption": c.md = l.md.sha512.create(); break; case "RSASSA-PSS": c.md = l.md.sha256.create() } } if (null === c.md) { var s = new Error("Could not compute certificate digest. Unknown signature OID."); throw s.signatureOid = c.signatureOid, s } var y = p.toDer(c.tbsCertificate); c.md.update(y.getBytes()) } var v = l.md.sha1.create(); c.issuer.getField = function(e) { return a(c.issuer, e) } , c.issuer.addField = function(e) { i([e]), c.issuer.attributes.push(e) } , c.issuer.attributes = f.RDNAttributesAsArray(r.certIssuer, v), r.certIssuerUniqueId && (c.issuer.uniqueId = r.certIssuerUniqueId), c.issuer.hash = v.digest().toHex(); var m = l.md.sha1.create(); return c.subject.getField = function(e) { return a(c.subject, e) } , c.subject.addField = function(e) { i([e]), c.subject.attributes.push(e) } , c.subject.attributes = f.RDNAttributesAsArray(r.certSubject, m), r.certSubjectUniqueId && (c.subject.uniqueId = r.certSubjectUniqueId), c.subject.hash = m.digest().toHex(), r.certExtensions ? c.extensions = f.certificateExtensionsFromAsn1(r.certExtensions) : c.extensions = [], c.publicKey = f.publicKeyFromAsn1(r.subjectPublicKeyInfo), c } , f.certificateExtensionsFromAsn1 = function(e) { for (var t = [], r = 0; r < e.value.length; ++r) for (var a = e.value[r], n = 0; n < a.value.length; ++n) t.push(f.certificateExtensionFromAsn1(a.value[n])); return t } , f.certificateExtensionFromAsn1 = function(e) { var t = {}; if (t.id = p.derToOid(e.value[0].value), t.critical = !1, e.value[1].type === p.Type.BOOLEAN ? (t.critical = 0 !== e.value[1].value.charCodeAt(0), t.value = e.value[2].value) : t.value = e.value[1].value, t.id in h) if (t.name = h[t.id], "keyUsage" === t.name) { var r = p.fromDer(t.value) , a = 0 , n = 0; r.value.length > 1 && (a = r.value.charCodeAt(1), n = r.value.length > 2 ? r.value.charCodeAt(2) : 0), t.digitalSignature = 128 == (128 & a), t.nonRepudiation = 64 == (64 & a), t.keyEncipherment = 32 == (32 & a), t.dataEncipherment = 16 == (16 & a), t.keyAgreement = 8 == (8 & a), t.keyCertSign = 4 == (4 & a), t.cRLSign = 2 == (2 & a), t.encipherOnly = 1 == (1 & a), t.decipherOnly = 128 == (128 & n) } else if ("basicConstraints" === t.name) { var r = p.fromDer(t.value); r.value.length > 0 && r.value[0].type === p.Type.BOOLEAN ? t.cA = 0 !== r.value[0].value.charCodeAt(0) : t.cA = !1; var i = null; r.value.length > 0 && r.value[0].type === p.Type.INTEGER ? i = r.value[0].value : r.value.length > 1 && (i = r.value[1].value), null !== i && (t.pathLenConstraint = p.derToInteger(i)) } else if ("extKeyUsage" === t.name) for (var r = p.fromDer(t.value), s = 0; s < r.value.length; ++s) { var o = p.derToOid(r.value[s].value); o in h ? t[h[o]] = !0 : t[o] = !0 } else if ("nsCertType" === t.name) { var r = p.fromDer(t.value) , a = 0; r.value.length > 1 && (a = r.value.charCodeAt(1)), t.client = 128 == (128 & a), t.server = 64 == (64 & a), t.email = 32 == (32 & a), t.objsign = 16 == (16 & a), t.reserved = 8 == (8 & a), t.sslCA = 4 == (4 & a), t.emailCA = 2 == (2 & a), t.objCA = 1 == (1 & a) } else if ("subjectAltName" === t.name || "issuerAltName" === t.name) { t.altNames = []; for (var c, r = p.fromDer(t.value), u = 0; u < r.value.length; ++u) { c = r.value[u]; var f = { type: c.type, value: c.value }; switch (t.altNames.push(f), c.type) { case 1: case 2: case 6: break; case 7: f.ip = l.util.bytesToIP(c.value); break; case 8: f.oid = p.derToOid(c.value) } } } else if ("subjectKeyIdentifier" === t.name) { var r = p.fromDer(t.value); t.subjectKeyIdentifier = l.util.bytesToHex(r.value) } return t } , f.certificationRequestFromAsn1 = function(e, t) { var r = {} , n = []; if (!p.validate(e, C, r, n)) { var s = new Error("Cannot read PKCS#10 certificate request. ASN.1 object is not a PKCS#10 CertificationRequest."); throw s.errors = n, s } var o = p.derToOid(r.publicKeyOid); if (o !== f.oids.rsaEncryption) throw new Error("Cannot read public key. OID is not RSA."); var c = f.createCertificationRequest(); if (c.version = r.csrVersion ? r.csrVersion.charCodeAt(0) : 0, c.signatureOid = l.asn1.derToOid(r.csrSignatureOid), c.signatureParameters = E(c.signatureOid, r.csrSignatureParams, !0), c.siginfo.algorithmOid = l.asn1.derToOid(r.csrSignatureOid), c.siginfo.parameters = E(c.siginfo.algorithmOid, r.csrSignatureParams, !1), c.signature = r.csrSignature, c.certificationRequestInfo = r.certificationRequestInfo, t) { if (c.md = null, c.signatureOid in h) { var o = h[c.signatureOid]; switch (o) { case "sha1WithRSAEncryption": c.md = l.md.sha1.create(); break; case "md5WithRSAEncryption": c.md = l.md.md5.create(); break; case "sha256WithRSAEncryption": c.md = l.md.sha256.create(); break; case "sha384WithRSAEncryption": c.md = l.md.sha384.create(); break; case "sha512WithRSAEncryption": c.md = l.md.sha512.create(); break; case "RSASSA-PSS": c.md = l.md.sha256.create() } } if (null === c.md) { var s = new Error("Could not compute certification request digest. Unknown signature OID."); throw s.signatureOid = c.signatureOid, s } var u = p.toDer(c.certificationRequestInfo); c.md.update(u.getBytes()) } var d = l.md.sha1.create(); return c.subject.getField = function(e) { return a(c.subject, e) } , c.subject.addField = function(e) { i([e]), c.subject.attributes.push(e) } , c.subject.attributes = f.RDNAttributesAsArray(r.certificationRequestInfoSubject, d), c.subject.hash = d.digest().toHex(), c.publicKey = f.publicKeyFromAsn1(r.subjectPublicKeyInfo), c.getAttribute = function(e) { return a(c, e) } , c.addAttribute = function(e) { i([e]), c.attributes.push(e) } , c.attributes = f.CRIAttributesAsArray(r.certificationRequestInfoAttributes || []), c } , f.createCertificationRequest = function() { var e = {}; return e.version = 0, e.signatureOid = null, e.signature = null, e.siginfo = {}, e.siginfo.algorithmOid = null, e.subject = {}, e.subject.getField = function(t) { return a(e.subject, t) } , e.subject.addField = function(t) { i([t]), e.subject.attributes.push(t) } , e.subject.attributes = [], e.subject.hash = null, e.publicKey = null, e.attributes = [], e.getAttribute = function(t) { return a(e, t) } , e.addAttribute = function(t) { i([t]), e.attributes.push(t) } , e.md = null, e.setSubject = function(t) { i(t), e.subject.attributes = t, e.subject.hash = null } , e.setAttributes = function(t) { i(t), e.attributes = t } , e.sign = function(t, r) { e.md = r || l.md.sha1.create(); var a = h[e.md.algorithm + "WithRSAEncryption"]; if (!a) { var n = new Error("Could not compute certification request digest. Unknown message digest algorithm OID."); throw n.algorithm = e.md.algorithm, n } e.signatureOid = e.siginfo.algorithmOid = a, e.certificationRequestInfo = f.getCertificationRequestInfo(e); var i = p.toDer(e.certificationRequestInfo); e.md.update(i.getBytes()), e.signature = t.sign(e.md) } , e.verify = function() { var t = !1 , r = e.md; if (null === r) { if (e.signatureOid in h) { switch (h[e.signatureOid]) { case "sha1WithRSAEncryption": r = l.md.sha1.create(); break; case "md5WithRSAEncryption": r = l.md.md5.create(); break; case "sha256WithRSAEncryption": r = l.md.sha256.create(); break; case "sha384WithRSAEncryption": r = l.md.sha384.create(); break; case "sha512WithRSAEncryption": r = l.md.sha512.create(); break; case "RSASSA-PSS": r = l.md.sha256.create() } } if (null === r) { var a = new Error("Could not compute certification request digest. Unknown signature OID."); throw a.signatureOid = e.signatureOid, a } var n = e.certificationRequestInfo || f.getCertificationRequestInfo(e) , i = p.toDer(n); r.update(i.getBytes()) } if (null !== r) { var s; switch (e.signatureOid) { case h.sha1WithRSAEncryption: break; case h["RSASSA-PSS"]: var o, c; if (void 0 === (o = h[e.signatureParameters.mgf.hash.algorithmOid]) || void 0 === l.md[o]) { var a = new Error("Unsupported MGF hash function."); throw a.oid = e.signatureParameters.mgf.hash.algorithmOid, a.name = o, a } if (void 0 === (c = h[e.signatureParameters.mgf.algorithmOid]) || void 0 === l.mgf[c]) { var a = new Error("Unsupported MGF function."); throw a.oid = e.signatureParameters.mgf.algorithmOid, a.name = c, a } if (c = l.mgf[c].create(l.md[o].create()), void 0 === (o = h[e.signatureParameters.hash.algorithmOid]) || void 0 === l.md[o]) { var a = new Error("Unsupported RSASSA-PSS hash function."); throw a.oid = e.signatureParameters.hash.algorithmOid, a.name = o, a } s = l.pss.create(l.md[o].create(), c, e.signatureParameters.saltLength) } t = e.publicKey.verify(r.digest().getBytes(), e.signature, s) } return t } , e } ; const S = new Date("1950-01-01T00:00:00Z") , T = new Date("2050-01-01T00:00:00Z"); f.getTBSCertificate = function(e) { var t = u(e.validity.notBefore) , r = u(e.validity.notAfter) , a = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.CONTEXT_SPECIFIC, 0, !0, [p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(e.version).getBytes())]), p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, l.util.hexToBytes(e.serialNumber)), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.siginfo.algorithmOid).getBytes()), o(e.siginfo.algorithmOid, e.siginfo.parameters)]), n(e.issuer), p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [t, r]), n(e.subject), f.publicKeyToAsn1(e.publicKey)]); return e.issuer.uniqueId && a.value.push(p.create(p.Class.CONTEXT_SPECIFIC, 1, !0, [p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.issuer.uniqueId)])), e.subject.uniqueId && a.value.push(p.create(p.Class.CONTEXT_SPECIFIC, 2, !0, [p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.subject.uniqueId)])), e.extensions.length > 0 && a.value.push(f.certificateExtensionsToAsn1(e.extensions)), a } , f.getCertificationRequestInfo = function(e) { return p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.INTEGER, !1, p.integerToDer(e.version).getBytes()), n(e.subject), f.publicKeyToAsn1(e.publicKey), c(e)]) } , f.distinguishedNameToAsn1 = function(e) { return n(e) } , f.certificateToAsn1 = function(e) { var t = e.tbsCertificate || f.getTBSCertificate(e); return p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [t, p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.signatureOid).getBytes()), o(e.signatureOid, e.signatureParameters)]), p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.signature)]) } , f.certificateExtensionsToAsn1 = function(e) { var t = p.create(p.Class.CONTEXT_SPECIFIC, 3, !0, []) , r = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []); t.value.push(r); for (var a = 0; a < e.length; ++a) r.value.push(f.certificateExtensionToAsn1(e[a])); return t } , f.certificateExtensionToAsn1 = function(e) { var t = p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, []); t.value.push(p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.id).getBytes())), e.critical && t.value.push(p.create(p.Class.UNIVERSAL, p.Type.BOOLEAN, !1, String.fromCharCode(255))); var r = e.value; return "string" != typeof e.value && (r = p.toDer(r).getBytes()), t.value.push(p.create(p.Class.UNIVERSAL, p.Type.OCTETSTRING, !1, r)), t } , f.certificationRequestToAsn1 = function(e) { var t = e.certificationRequestInfo || f.getCertificationRequestInfo(e); return p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [t, p.create(p.Class.UNIVERSAL, p.Type.SEQUENCE, !0, [p.create(p.Class.UNIVERSAL, p.Type.OID, !1, p.oidToDer(e.signatureOid).getBytes()), o(e.signatureOid, e.signatureParameters)]), p.create(p.Class.UNIVERSAL, p.Type.BITSTRING, !1, String.fromCharCode(0) + e.signature)]) } , f.createCaStore = function(e) { function t(e) { return r(e), a.certs[e.hash] || null } function r(e) { if (!e.hash) { var t = l.md.sha1.create(); e.attributes = f.RDNAttributesAsArray(n(e), t), e.hash = t.digest().toHex() } } var a = { certs: {} }; if (a.getIssuer = function(e) { return t(e.issuer) } , a.addCertificate = function(e) { if ("string" == typeof e && (e = l.pki.certificateFromPem(e)), r(e.subject), !a.hasCertificate(e)) if (e.subject.hash in a.certs) { var t = a.certs[e.subject.hash]; l.util.isArray(t) || (t = [t]), t.push(e), a.certs[e.subject.hash] = t } else a.certs[e.subject.hash] = e } , a.hasCertificate = function(e) { "string" == typeof e && (e = l.pki.certificateFromPem(e)); var r = t(e.subject); if (!r) return !1; l.util.isArray(r) || (r = [r]); for (var a = p.toDer(f.certificateToAsn1(e)).getBytes(), n = 0; n < r.length; ++n) { if (a === p.toDer(f.certificateToAsn1(r[n])).getBytes()) return !0 } return !1 } , a.listAllCertificates = function() { var e = []; for (var t in a.certs) if (a.certs.hasOwnProperty(t)) { var r = a.certs[t]; if (l.util.isArray(r)) for (var n = 0; n < r.length; ++n) e.push(r[n]); else e.push(r) } return e } , a.removeCertificate = function(e) { var n; if ("string" == typeof e && (e = l.pki.certificateFromPem(e)), r(e.subject), !a.hasCertificate(e)) return null; var i = t(e.subject); if (!l.util.isArray(i)) return n = a.certs[e.subject.hash], delete a.certs[e.subject.hash], n; for (var s = p.toDer(f.certificateToAsn1(e)).getBytes(), o = 0; o < i.length; ++o) { s === p.toDer(f.certificateToAsn1(i[o])).getBytes() && (n = i[o], i.splice(o, 1)) } return 0 === i.length && delete a.certs[e.subject.hash], n } , e) for (var i = 0; i < e.length; ++i) { var s = e[i]; a.addCertificate(s) } return a } , f.certificateError = { bad_certificate: "forge.pki.BadCertificate", unsupported_certificate: "forge.pki.UnsupportedCertificate", certificate_revoked: "forge.pki.CertificateRevoked", certificate_expired: "forge.pki.CertificateExpired", certificate_unknown: "forge.pki.CertificateUnknown", unknown_ca: "forge.pki.UnknownCertificateAuthority" }, f.verifyCertificateChain = function(e, t, r) { "function" == typeof r && (r = { verify: r }), r = r || {}, t = t.slice(0); var a = t.slice(0) , n = r.validityCheckDate; void 0 === n && (n = new Date); var i = !0 , s = null , o = 0; do { var c = t.shift() , u = null , p = !1; if (n && (n < c.validity.notBefore || n > c.validity.notAfter) && (s = { message: "Certificate is not valid yet or has expired.", error: f.certificateError.certificate_expired, notBefore: c.validity.notBefore, notAfter: c.validity.notAfter, now: n }), null === s) { if (u = t[0] || e.getIssuer(c), null === u && c.isIssuer(c) && (p = !0, u = c), u) { var h = u; l.util.isArray(h) || (h = [h]); for (var d = !1; !d && h.length > 0; ) { u = h.shift(); try { d = u.verify(c) } catch (e) {} } d || (s = { message: "Certificate signature is invalid.", error: f.certificateError.bad_certificate }) } null !== s || u && !p || e.hasCertificate(c) || (s = { message: "Certificate is not trusted.", error: f.certificateError.unknown_ca }) } if (null === s && u && !c.isIssuer(u) && (s = { message: "Certificate issuer is invalid.", error: f.certificateError.bad_certificate }), null === s) for (var y = { keyUsage: !0, basicConstraints: !0 }, g = 0; null === s && g < c.extensions.length; ++g) { var v = c.extensions[g]; !v.critical || v.name in y || (s = { message: "Certificate has an unsupported critical extension.", error: f.certificateError.unsupported_certificate }) } if (null === s && (!i || 0 === t.length && (!u || p))) { var m = c.getExtension("basicConstraints") , C = c.getExtension("keyUsage"); if (null !== C && (C.keyCertSign && null !== m || (s = { message: "Certificate keyUsage or basicConstraints conflict or indicate that the certificate is not a CA. If the certificate is the only one in the chain or isn't the first then the certificate must be a valid CA.", error: f.certificateError.bad_certificate })), null !== s || null === m || m.cA || (s = { message: "Certificate basicConstraints indicates the certificate is not a CA.", error: f.certificateError.bad_certificate }), null === s && null !== C && "pathLenConstraint"in m) { o - 1 > m.pathLenConstraint && (s = { message: "Certificate basicConstraints pathLenConstraint violated.", error: f.certificateError.bad_certificate }) } } var E = null === s || s.error , S = r.verify ? r.verify(E, o, a) : E; if (!0 !== S) throw !0 === E && (s = { message: "The application rejected the certificate.", error: f.certificateError.bad_certificate }), (S || 0 === S) && ("object" != typeof S || l.util.isArray(S) ? "string" == typeof S && (s.error = S) : (S.message && (s.message = S.message), S.error && (s.error = S.error))), s; s = null, i = !1, ++o } while (t.length > 0); return !0 } } , function(e, t, r) { var a = r(0); r(2), r(1), (e.exports = a.pss = a.pss || {}).create = function(e) { 3 === arguments.length && (e = { md: arguments[0], mgf: arguments[1], saltLength: arguments[2] }); var t = e.md , r = e.mgf , n = t.digestLength , i = e.salt || null; "string" == typeof i && (i = a.util.createBuffer(i)); var s; if ("saltLength"in e) s = e.saltLength; else { if (null === i) throw new Error("Salt length not specified or specific salt not given."); s = i.length() } if (null !== i && i.length() !== s) throw new Error("Given salt length does not match length of given salt."); var o = e.prng || a.random , c = {}; return c.encode = function(e, c) { var u, l = c - 1, p = Math.ceil(l / 8), f = e.digest().getBytes(); if (p < n + s + 2) throw new Error("Message is too long to encrypt."); var h; h = null === i ? o.getBytesSync(s) : i.bytes(); var d = new a.util.ByteBuffer; d.fillWithByte(0, 8), d.putBytes(f), d.putBytes(h), t.start(), t.update(d.getBytes()); var y = t.digest().getBytes() , g = new a.util.ByteBuffer; g.fillWithByte(0, p - s - n - 2), g.putByte(1), g.putBytes(h); var v = g.getBytes() , m = p - n - 1 , C = r.generate(y, m) , E = ""; for (u = 0; u < m; u++) E += String.fromCharCode(v.charCodeAt(u) ^ C.charCodeAt(u)); var S = 65280 >> 8 * p - l & 255; return (E = String.fromCharCode(E.charCodeAt(0) & ~S) + E.substr(1)) + y + String.fromCharCode(188) } , c.verify = function(e, i, o) { var c, u = o - 1, l = Math.ceil(u / 8); if (i = i.substr(-l), l < n + s + 2) throw new Error("Inconsistent parameters to PSS signature verification."); if (188 !== i.charCodeAt(l - 1)) throw new Error("Encoded message does not end in 0xBC."); var p = l - n - 1 , f = i.substr(0, p) , h = i.substr(p, n) , d = 65280 >> 8 * l - u & 255; if (0 != (f.charCodeAt(0) & d)) throw new Error("Bits beyond keysize not zero as expected."); var y = r.generate(h, p) , g = ""; for (c = 0; c < p; c++) g += String.fromCharCode(f.charCodeAt(c) ^ y.charCodeAt(c)); g = String.fromCharCode(g.charCodeAt(0) & ~d) + g.substr(1); var v = l - n - s - 2; for (c = 0; c < v; c++) if (0 !== g.charCodeAt(c)) throw new Error("Leftmost octets not zero as expected"); if (1 !== g.charCodeAt(v)) throw new Error("Inconsistent PSS signature, 0x01 marker not found"); var m = g.substr(-s) , C = new a.util.ByteBuffer; return C.fillWithByte(0, 8), C.putBytes(e), C.putBytes(m), t.start(), t.update(C.getBytes()), h === t.digest().getBytes() } , c } } , function(e, t, r) { function a(e) { if ("string" == typeof e && (e = s.util.createBuffer(e)), s.util.isArray(e) && e.length > 4) { var t = e; e = s.util.createBuffer(); for (var r = 0; r < t.length; ++r) e.putByte(t[r]) } return s.util.isArray(e) || (e = [e.getInt32(), e.getInt32(), e.getInt32(), e.getInt32()]), e } function n(e) { e[e.length - 1] = e[e.length - 1] + 1 & 4294967295 } function i(e) { return [e / 4294967296 | 0, 4294967295 & e] } var s = r(0); r(1), s.cipher = s.cipher || {}; var o = e.exports = s.cipher.modes = s.cipher.modes || {}; o.ecb = function(e) { e = e || {}, this.name = "ECB", this.cipher = e.cipher, this.blockSize = e.blockSize || 16, this._ints = this.blockSize / 4, this._inBlock = new Array(this._ints), this._outBlock = new Array(this._ints) } , o.ecb.prototype.start = function(e) {} , o.ecb.prototype.encrypt = function(e, t, r) { if (e.length() < this.blockSize && !(r && e.length() > 0)) return !0; for (var a = 0; a < this._ints; ++a) this._inBlock[a] = e.getInt32(); this.cipher.encrypt(this._inBlock, this._outBlock); for (var a = 0; a < this._ints; ++a) t.putInt32(this._outBlock[a]) } , o.ecb.prototype.decrypt = function(e, t, r) { if (e.length() < this.blockSize && !(r && e.length() > 0)) return !0; for (var a = 0; a < this._ints; ++a) this._inBlock[a] = e.getInt32(); this.cipher.decrypt(this._inBlock, this._outBlock); for (var a = 0; a < this._ints; ++a) t.putInt32(this._outBlock[a]) } , o.ecb.prototype.pad = function(e, t) { var r = e.length() === this.blockSize ? this.blockSize : this.blockSize - e.length(); return e.fillWithByte(r, r), !0 } , o.ecb.prototype.unpad = function(e, t) { if (t.overflow > 0) return !1; var r = e.length() , a = e.at(r - 1); return !(a > this.blockSize << 2) && (e.truncate(a), !0) } , o.cbc = function(e) { e = e || {}, this.name = "CBC", this.cipher = e.cipher, this.blockSize = e.blockSize || 16, this._ints = this.blockSize / 4, this._inBlock = new Array(this._ints), this._outBlock = new Array(this._ints) } , o.cbc.prototype.start = function(e) { if (null === e.iv) { if (!this._prev) throw new Error("Invalid IV parameter."); this._iv = this._prev.slice(0) } else { if (!("iv"in e)) throw new Error("Invalid IV parameter."); this._iv = a(e.iv), this._prev = this._iv.slice(0) } } , o.cbc.prototype.encrypt = function(e, t, r) { if (e.length() < this.blockSize && !(r && e.length() > 0)) return !0; for (var a = 0; a < this._ints; ++a) this._inBlock[a] = this._prev[a] ^ e.getInt32(); this.cipher.encrypt(this._inBlock, this._outBlock); for (var a = 0; a < this._ints; ++a) t.putInt32(this._outBlock[a]); this._prev = this._outBlock } , o.cbc.prototype.decrypt = function(e, t, r) { if (e.length() < this.blockSize && !(r && e.length() > 0)) return !0; for (var a = 0; a < this._ints; ++a) this._inBlock[a] = e.getInt32(); this.cipher.decrypt(this._inBlock, this._outBlock); for (var a = 0; a < this._ints; ++a) t.putInt32(this._prev[a] ^ this._outBlock[a]); this._prev = this._inBlock.slice(0) } , o.cbc.prototype.pad = function(e, t) { var r = e.length() === this.blockSize ? this.blockSize : this.blockSize - e.length(); return e.fillWithByte(r, r), !0 } , o.cbc.prototype.unpad = function(e, t) { if (t.overflow > 0) return !1; var r = e.length() , a = e.at(r - 1); return !(a > this.blockSize << 2) && (e.truncate(a), !0) } , o.cfb = function(e) { e = e || {}, this.name = "CFB", this.cipher = e.cipher, this.blockSize = e.blockSize || 16, this._ints = this.blockSize / 4, this._inBlock = null, this._outBlock = new Array(this._ints), this._partialBlock = new Array(this._ints), this._partialOutput = s.util.createBuffer(), this._partialBytes = 0 } , o.cfb.prototype.start = function(e) { if (!("iv"in e)) throw new Error("Invalid IV parameter."); this._iv = a(e.iv), this._inBlock = this._iv.slice(0), this._partialBytes = 0 } , o.cfb.prototype.encrypt = function(e, t, r) { var a = e.length(); if (0 === a) return !0; if (this.cipher.encrypt(this._inBlock, this._outBlock), 0 === this._partialBytes && a >= this.blockSize) for (var n = 0; n < this._ints; ++n) this._inBlock[n] = e.getInt32() ^ this._outBlock[n], t.putInt32(this._inBlock[n]); else { var i = (this.blockSize - a) % this.blockSize; i > 0 && (i = this.blockSize - i), this._partialOutput.clear(); for (var n = 0; n < this._ints; ++n) this._partialBlock[n] = e.getInt32() ^ this._outBlock[n], this._partialOutput.putInt32(this._partialBlock[n]); if (i > 0) e.read -= this.blockSize; else for (var n = 0; n < this._ints; ++n) this._inBlock[n] = this._partialBlock[n]; if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes), i > 0 && !r) return t.putBytes(this._partialOutput.getBytes(i - this._partialBytes)), this._partialBytes = i, !0; t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)), this._partialBytes = 0 } } , o.cfb.prototype.decrypt = function(e, t, r) { var a = e.length(); if (0 === a) return !0; if (this.cipher.encrypt(this._inBlock, this._outBlock), 0 === this._partialBytes && a >= this.blockSize) for (var n = 0; n < this._ints; ++n) this._inBlock[n] = e.getInt32(), t.putInt32(this._inBlock[n] ^ this._outBlock[n]); else { var i = (this.blockSize - a) % this.blockSize; i > 0 && (i = this.blockSize - i), this._partialOutput.clear(); for (var n = 0; n < this._ints; ++n) this._partialBlock[n] = e.getInt32(), this._partialOutput.putInt32(this._partialBlock[n] ^ this._outBlock[n]); if (i > 0) e.read -= this.blockSize; else for (var n = 0; n < this._ints; ++n) this._inBlock[n] = this._partialBlock[n]; if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes), i > 0 && !r) return t.putBytes(this._partialOutput.getBytes(i - this._partialBytes)), this._partialBytes = i, !0; t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)), this._partialBytes = 0 } } , o.ofb = function(e) { e = e || {}, this.name = "OFB", this.cipher = e.cipher, this.blockSize = e.blockSize || 16, this._ints = this.blockSize / 4, this._inBlock = null, this._outBlock = new Array(this._ints), this._partialOutput = s.util.createBuffer(), this._partialBytes = 0 } , o.ofb.prototype.start = function(e) { if (!("iv"in e)) throw new Error("Invalid IV parameter."); this._iv = a(e.iv), this._inBlock = this._iv.slice(0), this._partialBytes = 0 } , o.ofb.prototype.encrypt = function(e, t, r) { var a = e.length(); if (0 === e.length()) return !0; if (this.cipher.encrypt(this._inBlock, this._outBlock), 0 === this._partialBytes && a >= this.blockSize) for (var n = 0; n < this._ints; ++n) t.putInt32(e.getInt32() ^ this._outBlock[n]), this._inBlock[n] = this._outBlock[n]; else { var i = (this.blockSize - a) % this.blockSize; i > 0 && (i = this.blockSize - i), this._partialOutput.clear(); for (var n = 0; n < this._ints; ++n) this._partialOutput.putInt32(e.getInt32() ^ this._outBlock[n]); if (i > 0) e.read -= this.blockSize; else for (var n = 0; n < this._ints; ++n) this._inBlock[n] = this._outBlock[n]; if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes), i > 0 && !r) return t.putBytes(this._partialOutput.getBytes(i - this._partialBytes)), this._partialBytes = i, !0; t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)), this._partialBytes = 0 } } , o.ofb.prototype.decrypt = o.ofb.prototype.encrypt, o.ctr = function(e) { e = e || {}, this.name = "CTR", this.cipher = e.cipher, this.blockSize = e.blockSize || 16, this._ints = this.blockSize / 4, this._inBlock = null, this._outBlock = new Array(this._ints), this._partialOutput = s.util.createBuffer(), this._partialBytes = 0 } , o.ctr.prototype.start = function(e) { if (!("iv"in e)) throw new Error("Invalid IV parameter."); this._iv = a(e.iv), this._inBlock = this._iv.slice(0), this._partialBytes = 0 } , o.ctr.prototype.encrypt = function(e, t, r) { var a = e.length(); if (0 === a) return !0; if (this.cipher.encrypt(this._inBlock, this._outBlock), 0 === this._partialBytes && a >= this.blockSize) for (var i = 0; i < this._ints; ++i) t.putInt32(e.getInt32() ^ this._outBlock[i]); else { var s = (this.blockSize - a) % this.blockSize; s > 0 && (s = this.blockSize - s), this._partialOutput.clear(); for (var i = 0; i < this._ints; ++i) this._partialOutput.putInt32(e.getInt32() ^ this._outBlock[i]); if (s > 0 && (e.read -= this.blockSize), this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes), s > 0 && !r) return t.putBytes(this._partialOutput.getBytes(s - this._partialBytes)), this._partialBytes = s, !0; t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)), this._partialBytes = 0 } n(this._inBlock) } , o.ctr.prototype.decrypt = o.ctr.prototype.encrypt, o.gcm = function(e) { e = e || {}, this.name = "GCM", this.cipher = e.cipher, this.blockSize = e.blockSize || 16, this._ints = this.blockSize / 4, this._inBlock = new Array(this._ints), this._outBlock = new Array(this._ints), this._partialOutput = s.util.createBuffer(), this._partialBytes = 0, this._R = 3774873600 } , o.gcm.prototype.start = function(e) { if (!("iv"in e)) throw new Error("Invalid IV parameter."); var t = s.util.createBuffer(e.iv); this._cipherLength = 0; var r; if (r = "additionalData"in e ? s.util.createBuffer(e.additionalData) : s.util.createBuffer(), this._tagLength = "tagLength"in e ? e.tagLength : 128, this._tag = null, e.decrypt && (this._tag = s.util.createBuffer(e.tag).getBytes(), this._tag.length !== this._tagLength / 8)) throw new Error("Authentication tag does not match tag length."); this._hashBlock = new Array(this._ints), this.tag = null, this._hashSubkey = new Array(this._ints), this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey), this.componentBits = 4, this._m = this.generateHashTable(this._hashSubkey, this.componentBits); var a = t.length(); if (12 === a) this._j0 = [t.getInt32(), t.getInt32(), t.getInt32(), 1]; else { for (this._j0 = [0, 0, 0, 0]; t.length() > 0; ) this._j0 = this.ghash(this._hashSubkey, this._j0, [t.getInt32(), t.getInt32(), t.getInt32(), t.getInt32()]); this._j0 = this.ghash(this._hashSubkey, this._j0, [0, 0].concat(i(8 * a))) } this._inBlock = this._j0.slice(0), n(this._inBlock), this._partialBytes = 0, r = s.util.createBuffer(r), this._aDataLength = i(8 * r.length()); var o = r.length() % this.blockSize; for (o && r.fillWithByte(0, this.blockSize - o), this._s = [0, 0, 0, 0]; r.length() > 0; ) this._s = this.ghash(this._hashSubkey, this._s, [r.getInt32(), r.getInt32(), r.getInt32(), r.getInt32()]) } , o.gcm.prototype.encrypt = function(e, t, r) { var a = e.length(); if (0 === a) return !0; if (this.cipher.encrypt(this._inBlock, this._outBlock), 0 === this._partialBytes && a >= this.blockSize) { for (var i = 0; i < this._ints; ++i) t.putInt32(this._outBlock[i] ^= e.getInt32()); this._cipherLength += this.blockSize } else { var s = (this.blockSize - a) % this.blockSize; s > 0 && (s = this.blockSize - s), this._partialOutput.clear(); for (var i = 0; i < this._ints; ++i) this._partialOutput.putInt32(e.getInt32() ^ this._outBlock[i]); if (s <= 0 || r) { if (r) { var o = a % this.blockSize; this._cipherLength += o, this._partialOutput.truncate(this.blockSize - o) } else this._cipherLength += this.blockSize; for (var i = 0; i < this._ints; ++i) this._outBlock[i] = this._partialOutput.getInt32(); this._partialOutput.read -= this.blockSize } if (this._partialBytes > 0 && this._partialOutput.getBytes(this._partialBytes), s > 0 && !r) return e.read -= this.blockSize, t.putBytes(this._partialOutput.getBytes(s - this._partialBytes)), this._partialBytes = s, !0; t.putBytes(this._partialOutput.getBytes(a - this._partialBytes)), this._partialBytes = 0 } this._s = this.ghash(this._hashSubkey, this._s, this._outBlock), n(this._inBlock) } , o.gcm.prototype.decrypt = function(e, t, r) { var a = e.length(); if (a < this.blockSize && !(r && a > 0)) return !0; this.cipher.encrypt(this._inBlock, this._outBlock), n(this._inBlock), this._hashBlock[0] = e.getInt32(), this._hashBlock[1] = e.getInt32(), this._hashBlock[2] = e.getInt32(), this._hashBlock[3] = e.getInt32(), this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock); for (var i = 0; i < this._ints; ++i) t.putInt32(this._outBlock[i] ^ this._hashBlock[i]); a < this.blockSize ? this._cipherLength += a % this.blockSize : this._cipherLength += this.blockSize } , o.gcm.prototype.afterFinish = function(e, t) { var r = !0; t.decrypt && t.overflow && e.truncate(this.blockSize - t.overflow), this.tag = s.util.createBuffer(); var a = this._aDataLength.concat(i(8 * this._cipherLength)); this._s = this.ghash(this._hashSubkey, this._s, a); var n = []; this.cipher.encrypt(this._j0, n); for (var o = 0; o < this._ints; ++o) this.tag.putInt32(this._s[o] ^ n[o]); return this.tag.truncate(this.tag.length() % (this._tagLength / 8)), t.decrypt && this.tag.bytes() !== this._tag && (r = !1), r } , o.gcm.prototype.multiply = function(e, t) { for (var r = [0, 0, 0, 0], a = t.slice(0), n = 0; n < 128; ++n) { e[n / 32 | 0] & 1 << 31 - n % 32 && (r[0] ^= a[0], r[1] ^= a[1], r[2] ^= a[2], r[3] ^= a[3]), this.pow(a, a) } return r } , o.gcm.prototype.pow = function(e, t) { for (var r = 1 & e[3], a = 3; a > 0; --a) t[a] = e[a] >>> 1 | (1 & e[a - 1]) << 31; t[0] = e[0] >>> 1, r && (t[0] ^= this._R) } , o.gcm.prototype.tableMultiply = function(e) { for (var t = [0, 0, 0, 0], r = 0; r < 32; ++r) { var a = r / 8 | 0 , n = e[a] >>> 4 * (7 - r % 8) & 15 , i = this._m[r][n]; t[0] ^= i[0], t[1] ^= i[1], t[2] ^= i[2], t[3] ^= i[3] } return t } , o.gcm.prototype.ghash = function(e, t, r) { return t[0] ^= r[0], t[1] ^= r[1], t[2] ^= r[2], t[3] ^= r[3], this.tableMultiply(t) } , o.gcm.prototype.generateHashTable = function(e, t) { for (var r = 8 / t, a = 4 * r, n = 16 * r, i = new Array(n), s = 0; s < n; ++s) { var o = [0, 0, 0, 0] , c = s / a | 0 , u = (a - 1 - s % a) * t; o[c] = 1 << t - 1 << u, i[s] = this.generateSubHashTable(this.multiply(o, e), t) } return i } , o.gcm.prototype.generateSubHashTable = function(e, t) { var r = 1 << t , a = r >>> 1 , n = new Array(r); n[a] = e.slice(0); for (var i = a >>> 1; i > 0; ) this.pow(n[2 * i], n[i] = []), i >>= 1; for (i = 2; i < a; ) { for (var s = 1; s < i; ++s) { var o = n[i] , c = n[s]; n[i + s] = [o[0] ^ c[0], o[1] ^ c[1], o[2] ^ c[2], o[3] ^ c[3]] } i *= 2 } for (n[0] = [0, 0, 0, 0], i = a + 1; i < r; ++i) { var u = n[i ^ a]; n[i] = [e[0] ^ u[0], e[1] ^ u[1], e[2] ^ u[2], e[3] ^ u[3]] } return n } } , function(e, t, r) { var a = r(0); r(3), r(8), r(14), r(7), r(21), r(2), r(9), r(1); var n = function(e, t, r, n) { var i = a.util.createBuffer() , s = e.length >> 1 , o = s + (1 & e.length) , c = e.substr(0, o) , u = e.substr(s, o) , l = a.util.createBuffer() , p = a.hmac.create(); r = t + r; var f = Math.ceil(n / 16) , h = Math.ceil(n / 20); p.start("MD5", c); var d = a.util.createBuffer(); l.putBytes(r); for (var y = 0; y < f; ++y) p.start(null, null), p.update(l.getBytes()), l.putBuffer(p.digest()), p.start(null, null), p.update(l.bytes() + r), d.putBuffer(p.digest()); p.start("SHA1", u); var g = a.util.createBuffer(); l.clear(), l.putBytes(r); for (var y = 0; y < h; ++y) p.start(null, null), p.update(l.getBytes()), l.putBuffer(p.digest()), p.start(null, null), p.update(l.bytes() + r), g.putBuffer(p.digest()); return i.putBytes(a.util.xorBytes(d.getBytes(), g.getBytes(), n)), i } , i = function(e, t, r) { var n = a.hmac.create(); n.start("SHA1", e); var i = a.util.createBuffer(); return i.putInt32(t[0]), i.putInt32(t[1]), i.putByte(r.type), i.putByte(r.version.major), i.putByte(r.version.minor), i.putInt16(r.length), i.putBytes(r.fragment.bytes()), n.update(i.getBytes()), n.digest().getBytes() } , s = function(e, t, r) { var n = !1; try { var i = e.deflate(t.fragment.getBytes()); t.fragment = a.util.createBuffer(i), t.length = i.length, n = !0 } catch (e) {} return n } , o = function(e, t, r) { var n = !1; try { var i = e.inflate(t.fragment.getBytes()); t.fragment = a.util.createBuffer(i), t.length = i.length, n = !0 } catch (e) {} return n } , c = function(e, t) { var r = 0; switch (t) { case 1: r = e.getByte(); break; case 2: r = e.getInt16(); break; case 3: r = e.getInt24(); break; case 4: r = e.getInt32() } return a.util.createBuffer(e.getBytes(r)) } , u = function(e, t, r) { e.putInt(r.length(), t << 3), e.putBuffer(r) } , l = {}; l.Versions = { TLS_1_0: { major: 3, minor: 1 }, TLS_1_1: { major: 3, minor: 2 }, TLS_1_2: { major: 3, minor: 3 } }, l.SupportedVersions = [l.Versions.TLS_1_1, l.Versions.TLS_1_0], l.Version = l.SupportedVersions[0], l.MaxFragment = 15360, l.ConnectionEnd = { server: 0, client: 1 }, l.PRFAlgorithm = { tls_prf_sha256: 0 }, l.BulkCipherAlgorithm = { none: null, rc4: 0, des3: 1, aes: 2 }, l.CipherType = { stream: 0, block: 1, aead: 2 }, l.MACAlgorithm = { none: null, hmac_md5: 0, hmac_sha1: 1, hmac_sha256: 2, hmac_sha384: 3, hmac_sha512: 4 }, l.CompressionMethod = { none: 0, deflate: 1 }, l.ContentType = { change_cipher_spec: 20, alert: 21, handshake: 22, application_data: 23, heartbeat: 24 }, l.HandshakeType = { hello_request: 0, client_hello: 1, server_hello: 2, certificate: 11, server_key_exchange: 12, certificate_request: 13, server_hello_done: 14, certificate_verify: 15, client_key_exchange: 16, finished: 20 }, l.Alert = {}, l.Alert.Level = { warning: 1, fatal: 2 }, l.Alert.Description = { close_notify: 0, unexpected_message: 10, bad_record_mac: 20, decryption_failed: 21, record_overflow: 22, decompression_failure: 30, handshake_failure: 40, bad_certificate: 42, unsupported_certificate: 43, certificate_revoked: 44, certificate_expired: 45, certificate_unknown: 46, illegal_parameter: 47, unknown_ca: 48, access_denied: 49, decode_error: 50, decrypt_error: 51, export_restriction: 60, protocol_version: 70, insufficient_security: 71, internal_error: 80, user_canceled: 90, no_renegotiation: 100 }, l.HeartbeatMessageType = { heartbeat_request: 1, heartbeat_response: 2 }, l.CipherSuites = {}, l.getCipherSuite = function(e) { var t = null; for (var r in l.CipherSuites) { var a = l.CipherSuites[r]; if (a.id[0] === e.charCodeAt(0) && a.id[1] === e.charCodeAt(1)) { t = a; break } } return t } , l.handleUnexpected = function(e, t) { !e.open && e.entity === l.ConnectionEnd.client || e.error(e, { message: "Unexpected message. Received TLS record out of order.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.unexpected_message } }) } , l.handleHelloRequest = function(e, t, r) { !e.handshaking && e.handshakes > 0 && (l.queue(e, l.createAlert(e, { level: l.Alert.Level.warning, description: l.Alert.Description.no_renegotiation })), l.flush(e)), e.process() } , l.parseHelloMessage = function(e, t, r) { var n = null , i = e.entity === l.ConnectionEnd.client; if (r < 38) e.error(e, { message: i ? "Invalid ServerHello message. Message too short." : "Invalid ClientHello message. Message too short.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.illegal_parameter } }); else { var s = t.fragment , o = s.length(); if (n = { version: { major: s.getByte(), minor: s.getByte() }, random: a.util.createBuffer(s.getBytes(32)), session_id: c(s, 1), extensions: [] }, i ? (n.cipher_suite = s.getBytes(2), n.compression_method = s.getByte()) : (n.cipher_suites = c(s, 2), n.compression_methods = c(s, 1)), (o = r - (o - s.length())) > 0) { for (var u = c(s, 2); u.length() > 0; ) n.extensions.push({ type: [u.getByte(), u.getByte()], data: c(u, 2) }); if (!i) for (var p = 0; p < n.extensions.length; ++p) { var f = n.extensions[p]; if (0 === f.type[0] && 0 === f.type[1]) for (var h = c(f.data, 2); h.length() > 0; ) { var d = h.getByte(); if (0 !== d) break; e.session.extensions.server_name.serverNameList.push(c(h, 2).getBytes()) } } } if (e.session.version && (n.version.major !== e.session.version.major || n.version.minor !== e.session.version.minor)) return e.error(e, { message: "TLS version change is disallowed during renegotiation.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.protocol_version } }); if (i) e.session.cipherSuite = l.getCipherSuite(n.cipher_suite); else for (var y = a.util.createBuffer(n.cipher_suites.bytes()); y.length() > 0 && (e.session.cipherSuite = l.getCipherSuite(y.getBytes(2)), null === e.session.cipherSuite); ) ; if (null === e.session.cipherSuite) return e.error(e, { message: "No cipher suites in common.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.handshake_failure }, cipherSuite: a.util.bytesToHex(n.cipher_suite) }); e.session.compressionMethod = i ? n.compression_method : l.CompressionMethod.none } return n } , l.createSecurityParameters = function(e, t) { var r = e.entity === l.ConnectionEnd.client , a = t.random.bytes() , n = r ? e.session.sp.client_random : a , i = r ? a : l.createRandom().getBytes(); e.session.sp = { entity: e.entity, prf_algorithm: l.PRFAlgorithm.tls_prf_sha256, bulk_cipher_algorithm: null, cipher_type: null, enc_key_length: null, block_length: null, fixed_iv_length: null, record_iv_length: null, mac_algorithm: null, mac_length: null, mac_key_length: null, compression_algorithm: e.session.compressionMethod, pre_master_secret: null, master_secret: null, client_random: n, server_random: i } } , l.handleServerHello = function(e, t, r) { var a = l.parseHelloMessage(e, t, r); if (!e.fail) { if (!(a.version.minor <= e.version.minor)) return e.error(e, { message: "Incompatible TLS version.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.protocol_version } }); e.version.minor = a.version.minor, e.session.version = e.version; var n = a.session_id.bytes(); n.length > 0 && n === e.session.id ? (e.expect = y, e.session.resuming = !0, e.session.sp.server_random = a.random.bytes()) : (e.expect = p, e.session.resuming = !1, l.createSecurityParameters(e, a)), e.session.id = n, e.process() } } , l.handleClientHello = function(e, t, r) { var n = l.parseHelloMessage(e, t, r); if (!e.fail) { var i = n.session_id.bytes() , s = null; if (e.sessionCache && (s = e.sessionCache.getSession(i), null === s ? i = "" : (s.version.major !== n.version.major || s.version.minor > n.version.minor) && (s = null, i = "")), 0 === i.length && (i = a.random.getBytes(32)), e.session.id = i, e.session.clientHelloVersion = n.version, e.session.sp = {}, s) e.version = e.session.version = s.version, e.session.sp = s.sp; else { for (var o, c = 1; c < l.SupportedVersions.length && (o = l.SupportedVersions[c], !(o.minor <= n.version.minor)); ++c) ; e.version = { major: o.major, minor: o.minor }, e.session.version = e.version } null !== s ? (e.expect = T, e.session.resuming = !0, e.session.sp.client_random = n.random.bytes()) : (e.expect = !1 !== e.verifyClient ? C : E, e.session.resuming = !1, l.createSecurityParameters(e, n)), e.open = !0, l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createServerHello(e) })), e.session.resuming ? (l.queue(e, l.createRecord(e, { type: l.ContentType.change_cipher_spec, data: l.createChangeCipherSpec() })), e.state.pending = l.createConnectionState(e), e.state.current.write = e.state.pending.write, l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createFinished(e) }))) : (l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createCertificate(e) })), e.fail || (l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createServerKeyExchange(e) })), !1 !== e.verifyClient && l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createCertificateRequest(e) })), l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createServerHelloDone(e) })))), l.flush(e), e.process() } } , l.handleCertificate = function(e, t, r) { if (r < 3) return e.error(e, { message: "Invalid Certificate message. Message too short.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.illegal_parameter } }); var n, i, s = t.fragment, o = { certificate_list: c(s, 3) }, u = []; try { for (; o.certificate_list.length() > 0; ) n = c(o.certificate_list, 3), i = a.asn1.fromDer(n), n = a.pki.certificateFromAsn1(i, !0), u.push(n) } catch (t) { return e.error(e, { message: "Could not parse certificate list.", cause: t, send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.bad_certificate } }) } var p = e.entity === l.ConnectionEnd.client; !p && !0 !== e.verifyClient || 0 !== u.length ? 0 === u.length ? e.expect = p ? f : E : (p ? e.session.serverCertificate = u[0] : e.session.clientCertificate = u[0], l.verifyCertificateChain(e, u) && (e.expect = p ? f : E)) : e.error(e, { message: p ? "No server certificate provided." : "No client certificate provided.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.illegal_parameter } }), e.process() } , l.handleServerKeyExchange = function(e, t, r) { if (r > 0) return e.error(e, { message: "Invalid key parameters. Only RSA is supported.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.unsupported_certificate } }); e.expect = h, e.process() } , l.handleClientKeyExchange = function(e, t, r) { if (r < 48) return e.error(e, { message: "Invalid key parameters. Only RSA is supported.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.unsupported_certificate } }); var n = t.fragment , i = { enc_pre_master_secret: c(n, 2).getBytes() } , s = null; if (e.getPrivateKey) try { s = e.getPrivateKey(e, e.session.serverCertificate), s = a.pki.privateKeyFromPem(s) } catch (t) { e.error(e, { message: "Could not get private key.", cause: t, send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.internal_error } }) } if (null === s) return e.error(e, { message: "No private key set.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.internal_error } }); try { var o = e.session.sp; o.pre_master_secret = s.decrypt(i.enc_pre_master_secret); var u = e.session.clientHelloVersion; if (u.major !== o.pre_master_secret.charCodeAt(0) || u.minor !== o.pre_master_secret.charCodeAt(1)) throw new Error("TLS version rollback attack detected.") } catch (e) { o.pre_master_secret = a.random.getBytes(48) } e.expect = T, null !== e.session.clientCertificate && (e.expect = S), e.process() } , l.handleCertificateRequest = function(e, t, r) { if (r < 3) return e.error(e, { message: "Invalid CertificateRequest. Message too short.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.illegal_parameter } }); var a = t.fragment , n = { certificate_types: c(a, 1), certificate_authorities: c(a, 2) }; e.session.certificateRequest = n, e.expect = d, e.process() } , l.handleCertificateVerify = function(e, t, r) { if (r < 2) return e.error(e, { message: "Invalid CertificateVerify. Message too short.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.illegal_parameter } }); var n = t.fragment; n.read -= 4; var i = n.bytes(); n.read += 4; var s = { signature: c(n, 2).getBytes() } , o = a.util.createBuffer(); o.putBuffer(e.session.md5.digest()), o.putBuffer(e.session.sha1.digest()), o = o.getBytes(); try { if (!e.session.clientCertificate.publicKey.verify(o, s.signature, "NONE")) throw new Error("CertificateVerify signature does not match."); e.session.md5.update(i), e.session.sha1.update(i) } catch (t) { return e.error(e, { message: "Bad signature in CertificateVerify.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.handshake_failure } }) } e.expect = T, e.process() } , l.handleServerHelloDone = function(e, t, r) { if (r > 0) return e.error(e, { message: "Invalid ServerHelloDone message. Invalid length.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.record_overflow } }); if (null === e.serverCertificate) { var n = { message: "No server certificate provided. Not enough security.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.insufficient_security } } , i = e.verify(e, n.alert.description, 0, []); if (!0 !== i) return (i || 0 === i) && ("object" != typeof i || a.util.isArray(i) ? "number" == typeof i && (n.alert.description = i) : (i.message && (n.message = i.message), i.alert && (n.alert.description = i.alert))), e.error(e, n) } null !== e.session.certificateRequest && (t = l.createRecord(e, { type: l.ContentType.handshake, data: l.createCertificate(e) }), l.queue(e, t)), t = l.createRecord(e, { type: l.ContentType.handshake, data: l.createClientKeyExchange(e) }), l.queue(e, t), e.expect = m; var s = function(e, t) { null !== e.session.certificateRequest && null !== e.session.clientCertificate && l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createCertificateVerify(e, t) })), l.queue(e, l.createRecord(e, { type: l.ContentType.change_cipher_spec, data: l.createChangeCipherSpec() })), e.state.pending = l.createConnectionState(e), e.state.current.write = e.state.pending.write, l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createFinished(e) })), e.expect = y, l.flush(e), e.process() }; if (null === e.session.certificateRequest || null === e.session.clientCertificate) return s(e, null); l.getClientSignature(e, s) } , l.handleChangeCipherSpec = function(e, t) { if (1 !== t.fragment.getByte()) return e.error(e, { message: "Invalid ChangeCipherSpec message received.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.illegal_parameter } }); var r = e.entity === l.ConnectionEnd.client; (e.session.resuming && r || !e.session.resuming && !r) && (e.state.pending = l.createConnectionState(e)), e.state.current.read = e.state.pending.read, (!e.session.resuming && r || e.session.resuming && !r) && (e.state.pending = null), e.expect = r ? g : I, e.process() } , l.handleFinished = function(e, t, r) { var i = t.fragment; i.read -= 4; var s = i.bytes(); i.read += 4; var o = t.fragment.getBytes(); i = a.util.createBuffer(), i.putBuffer(e.session.md5.digest()), i.putBuffer(e.session.sha1.digest()); var c = e.entity === l.ConnectionEnd.client , u = c ? "server finished" : "client finished" , p = e.session.sp; if (i = n(p.master_secret, u, i.getBytes(), 12), i.getBytes() !== o) return e.error(e, { message: "Invalid verify_data in Finished message.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.decrypt_error } }); e.session.md5.update(s), e.session.sha1.update(s), (e.session.resuming && c || !e.session.resuming && !c) && (l.queue(e, l.createRecord(e, { type: l.ContentType.change_cipher_spec, data: l.createChangeCipherSpec() })), e.state.current.write = e.state.pending.write, e.state.pending = null, l.queue(e, l.createRecord(e, { type: l.ContentType.handshake, data: l.createFinished(e) }))), e.expect = c ? v : b, e.handshaking = !1, ++e.handshakes, e.peerCertificate = c ? e.session.serverCertificate : e.session.clientCertificate, l.flush(e), e.isConnected = !0, e.connected(e), e.process() } , l.handleAlert = function(e, t) { var r, a = t.fragment, n = { level: a.getByte(), description: a.getByte() }; switch (n.description) { case l.Alert.Description.close_notify: r = "Connection closed."; break; case l.Alert.Description.unexpected_message: r = "Unexpected message."; break; case l.Alert.Description.bad_record_mac: r = "Bad record MAC."; break; case l.Alert.Description.decryption_failed: r = "Decryption failed."; break; case l.Alert.Description.record_overflow: r = "Record overflow."; break; case l.Alert.Description.decompression_failure: r = "Decompression failed."; break; case l.Alert.Description.handshake_failure: r = "Handshake failure."; break; case l.Alert.Description.bad_certificate: r = "Bad certificate."; break; case l.Alert.Description.unsupported_certificate: r = "Unsupported certificate."; break; case l.Alert.Description.certificate_revoked: r = "Certificate revoked."; break; case l.Alert.Description.certificate_expired: r = "Certificate expired."; break; case l.Alert.Description.certificate_unknown: r = "Certificate unknown."; break; case l.Alert.Description.illegal_parameter: r = "Illegal parameter."; break; case l.Alert.Description.unknown_ca: r = "Unknown certificate authority."; break; case l.Alert.Description.access_denied: r = "Access denied."; break; case l.Alert.Description.decode_error: r = "Decode error."; break; case l.Alert.Description.decrypt_error: r = "Decrypt error."; break; case l.Alert.Description.export_restriction: r = "Export restriction."; break; case l.Alert.Description.protocol_version: r = "Unsupported protocol version."; break; case l.Alert.Description.insufficient_security: r = "Insufficient security."; break; case l.Alert.Description.internal_error: r = "Internal error."; break; case l.Alert.Description.user_canceled: r = "User canceled."; break; case l.Alert.Description.no_renegotiation: r = "Renegotiation not supported."; break; default: r = "Unknown error." } if (n.description === l.Alert.Description.close_notify) return e.close(); e.error(e, { message: r, send: !1, origin: e.entity === l.ConnectionEnd.client ? "server" : "client", alert: n }), e.process() } , l.handleHandshake = function(e, t) { var r = t.fragment , n = r.getByte() , i = r.getInt24(); if (i > r.length()) return e.fragmented = t, t.fragment = a.util.createBuffer(), r.read -= 4, e.process(); e.fragmented = null, r.read -= 4; var s = r.bytes(i + 4); r.read += 4, n in x[e.entity][e.expect] ? (e.entity !== l.ConnectionEnd.server || e.open || e.fail || (e.handshaking = !0, e.session = { version: null, extensions: { server_name: { serverNameList: [] } }, cipherSuite: null, compressionMethod: null, serverCertificate: null, clientCertificate: null, md5: a.md.md5.create(), sha1: a.md.sha1.create() }), n !== l.HandshakeType.hello_request && n !== l.HandshakeType.certificate_verify && n !== l.HandshakeType.finished && (e.session.md5.update(s), e.session.sha1.update(s)), x[e.entity][e.expect][n](e, t, i)) : l.handleUnexpected(e, t) } , l.handleApplicationData = function(e, t) { e.data.putBuffer(t.fragment), e.dataReady(e), e.process() } , l.handleHeartbeat = function(e, t) { var r = t.fragment , n = r.getByte() , i = r.getInt16() , s = r.getBytes(i); if (n === l.HeartbeatMessageType.heartbeat_request) { if (e.handshaking || i > s.length) return e.process(); l.queue(e, l.createRecord(e, { type: l.ContentType.heartbeat, data: l.createHeartbeat(l.HeartbeatMessageType.heartbeat_response, s) })), l.flush(e) } else if (n === l.HeartbeatMessageType.heartbeat_response) { if (s !== e.expectedHeartbeatPayload) return e.process(); e.heartbeatReceived && e.heartbeatReceived(e, a.util.createBuffer(s)) } e.process() } ; var p = 1 , f = 2 , h = 3 , d = 4 , y = 5 , g = 6 , v = 7 , m = 8 , C = 1 , E = 2 , S = 3 , T = 4 , I = 5 , b = 6 , A = l.handleUnexpected , B = l.handleChangeCipherSpec , N = l.handleAlert , k = l.handleHandshake , w = l.handleApplicationData , R = l.handleHeartbeat , _ = []; _[l.ConnectionEnd.client] = [[A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [B, N, A, A, R], [A, N, k, A, R], [A, N, k, w, R], [A, N, k, A, R]], _[l.ConnectionEnd.server] = [[A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [A, N, k, A, R], [B, N, A, A, R], [A, N, k, A, R], [A, N, k, w, R], [A, N, k, A, R]]; var L = l.handleHelloRequest , U = l.handleServerHello , D = l.handleCertificate , P = l.handleServerKeyExchange , V = l.handleCertificateRequest , O = l.handleServerHelloDone , K = l.handleFinished , x = []; x[l.ConnectionEnd.client] = [[A, A, U, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, D, P, V, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, P, V, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, V, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, O, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, K], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [L, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A]]; var M = l.handleClientHello , F = l.handleClientKeyExchange , q = l.handleCertificateVerify; x[l.ConnectionEnd.server] = [[A, M, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, D, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, F, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, q, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, K], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A], [A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A]], l.generateKeys = function(e, t) { var r = n , a = t.client_random + t.server_random; e.session.resuming || (t.master_secret = r(t.pre_master_secret, "master secret", a, 48).bytes(), t.pre_master_secret = null), a = t.server_random + t.client_random; var i = 2 * t.mac_key_length + 2 * t.enc_key_length , s = e.version.major === l.Versions.TLS_1_0.major && e.version.minor === l.Versions.TLS_1_0.minor; s && (i += 2 * t.fixed_iv_length); var o = r(t.master_secret, "key expansion", a, i) , c = { client_write_MAC_key: o.getBytes(t.mac_key_length), server_write_MAC_key: o.getBytes(t.mac_key_length), client_write_key: o.getBytes(t.enc_key_length), server_write_key: o.getBytes(t.enc_key_length) }; return s && (c.client_write_IV = o.getBytes(t.fixed_iv_length), c.server_write_IV = o.getBytes(t.fixed_iv_length)), c } , l.createConnectionState = function(e) { var t = e.entity === l.ConnectionEnd.client , r = function() { var e = { sequenceNumber: [0, 0], macKey: null, macLength: 0, macFunction: null, cipherState: null, cipherFunction: function(e) { return !0 }, compressionState: null, compressFunction: function(e) { return !0 }, updateSequenceNumber: function() { 4294967295 === e.sequenceNumber[1] ? (e.sequenceNumber[1] = 0, ++e.sequenceNumber[0]) : ++e.sequenceNumber[1] } }; return e } , a = { read: r(), write: r() }; if (a.read.update = function(e, t) { return a.read.cipherFunction(t, a.read) ? a.read.compressFunction(e, t, a.read) || e.error(e, { message: "Could not decompress record.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.decompression_failure } }) : e.error(e, { message: "Could not decrypt record or bad MAC.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.bad_record_mac } }), !e.fail } , a.write.update = function(e, t) { return a.write.compressFunction(e, t, a.write) ? a.write.cipherFunction(t, a.write) || e.error(e, { message: "Could not encrypt record.", send: !1, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.internal_error } }) : e.error(e, { message: "Could not compress record.", send: !1, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.internal_error } }), !e.fail } , e.session) { var n = e.session.sp; switch (e.session.cipherSuite.initSecurityParameters(n), n.keys = l.generateKeys(e, n), a.read.macKey = t ? n.keys.server_write_MAC_key : n.keys.client_write_MAC_key, a.write.macKey = t ? n.keys.client_write_MAC_key : n.keys.server_write_MAC_key, e.session.cipherSuite.initConnectionState(a, e, n), n.compression_algorithm) { case l.CompressionMethod.none: break; case l.CompressionMethod.deflate: a.read.compressFunction = o, a.write.compressFunction = s; break; default: throw new Error("Unsupported compression algorithm.") } } return a } , l.createRandom = function() { var e = new Date , t = +e + 6e4 * e.getTimezoneOffset() , r = a.util.createBuffer(); return r.putInt32(t), r.putBytes(a.random.getBytes(28)), r } , l.createRecord = function(e, t) { return t.data ? { type: t.type, version: { major: e.version.major, minor: e.version.minor }, length: t.data.length(), fragment: t.data } : null } , l.createAlert = function(e, t) { var r = a.util.createBuffer(); return r.putByte(t.level), r.putByte(t.description), l.createRecord(e, { type: l.ContentType.alert, data: r }) } , l.createClientHello = function(e) { e.session.clientHelloVersion = { major: e.version.major, minor: e.version.minor }; for (var t = a.util.createBuffer(), r = 0; r < e.cipherSuites.length; ++r) { var n = e.cipherSuites[r]; t.putByte(n.id[0]), t.putByte(n.id[1]) } var i = t.length() , s = a.util.createBuffer(); s.putByte(l.CompressionMethod.none); var o = s.length() , c = a.util.createBuffer(); if (e.virtualHost) { var p = a.util.createBuffer(); p.putByte(0), p.putByte(0); var f = a.util.createBuffer(); f.putByte(0), u(f, 2, a.util.createBuffer(e.virtualHost)); var h = a.util.createBuffer(); u(h, 2, f), u(p, 2, h), c.putBuffer(p) } var d = c.length(); d > 0 && (d += 2); var y = e.session.id , g = y.length + 1 + 2 + 4 + 28 + 2 + i + 1 + o + d , v = a.util.createBuffer(); return v.putByte(l.HandshakeType.client_hello), v.putInt24(g), v.putByte(e.version.major), v.putByte(e.version.minor), v.putBytes(e.session.sp.client_random), u(v, 1, a.util.createBuffer(y)), u(v, 2, t), u(v, 1, s), d > 0 && u(v, 2, c), v } , l.createServerHello = function(e) { var t = e.session.id , r = t.length + 1 + 2 + 4 + 28 + 2 + 1 , n = a.util.createBuffer(); return n.putByte(l.HandshakeType.server_hello), n.putInt24(r), n.putByte(e.version.major), n.putByte(e.version.minor), n.putBytes(e.session.sp.server_random), u(n, 1, a.util.createBuffer(t)), n.putByte(e.session.cipherSuite.id[0]), n.putByte(e.session.cipherSuite.id[1]), n.putByte(e.session.compressionMethod), n } , l.createCertificate = function(e) { var t = e.entity === l.ConnectionEnd.client , r = null; if (e.getCertificate) { var n; n = t ? e.session.certificateRequest : e.session.extensions.server_name.serverNameList, r = e.getCertificate(e, n) } var i = a.util.createBuffer(); if (null !== r) try { a.util.isArray(r) || (r = [r]); for (var s = null, o = 0; o < r.length; ++o) { var c = a.pem.decode(r[o])[0]; if ("CERTIFICATE" !== c.type && "X509 CERTIFICATE" !== c.type && "TRUSTED CERTIFICATE" !== c.type) { var p = new Error('Could not convert certificate from PEM; PEM header type is not "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".'); throw p.headerType = c.type, p } if (c.procType && "ENCRYPTED" === c.procType.type) throw new Error("Could not convert certificate from PEM; PEM is encrypted."); var f = a.util.createBuffer(c.body); null === s && (s = a.asn1.fromDer(f.bytes(), !1)); var h = a.util.createBuffer(); u(h, 3, f), i.putBuffer(h) } r = a.pki.certificateFromAsn1(s), t ? e.session.clientCertificate = r : e.session.serverCertificate = r } catch (t) { return e.error(e, { message: "Could not send certificate list.", cause: t, send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.bad_certificate } }) } var d = 3 + i.length() , y = a.util.createBuffer(); return y.putByte(l.HandshakeType.certificate), y.putInt24(d), u(y, 3, i), y } , l.createClientKeyExchange = function(e) { var t = a.util.createBuffer(); t.putByte(e.session.clientHelloVersion.major), t.putByte(e.session.clientHelloVersion.minor), t.putBytes(a.random.getBytes(46)); var r = e.session.sp; r.pre_master_secret = t.getBytes(), t = e.session.serverCertificate.publicKey.encrypt(r.pre_master_secret); var n = t.length + 2 , i = a.util.createBuffer(); return i.putByte(l.HandshakeType.client_key_exchange), i.putInt24(n), i.putInt16(t.length), i.putBytes(t), i } , l.createServerKeyExchange = function(e) { var t = a.util.createBuffer(); return t } , l.getClientSignature = function(e, t) { var r = a.util.createBuffer(); r.putBuffer(e.session.md5.digest()), r.putBuffer(e.session.sha1.digest()), r = r.getBytes(), e.getSignature = e.getSignature || function(e, t, r) { var n = null; if (e.getPrivateKey) try { n = e.getPrivateKey(e, e.session.clientCertificate), n = a.pki.privateKeyFromPem(n) } catch (t) { e.error(e, { message: "Could not get private key.", cause: t, send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.internal_error } }) } null === n ? e.error(e, { message: "No private key set.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.internal_error } }) : t = n.sign(t, null), r(e, t) } , e.getSignature(e, r, t) } , l.createCertificateVerify = function(e, t) { var r = t.length + 2 , n = a.util.createBuffer(); return n.putByte(l.HandshakeType.certificate_verify), n.putInt24(r), n.putInt16(t.length), n.putBytes(t), n } , l.createCertificateRequest = function(e) { var t = a.util.createBuffer(); t.putByte(1); var r = a.util.createBuffer(); for (var n in e.caStore.certs) { var i = e.caStore.certs[n] , s = a.pki.distinguishedNameToAsn1(i.subject) , o = a.asn1.toDer(s); r.putInt16(o.length()), r.putBuffer(o) } var c = 1 + t.length() + 2 + r.length() , p = a.util.createBuffer(); return p.putByte(l.HandshakeType.certificate_request), p.putInt24(c), u(p, 1, t), u(p, 2, r), p } , l.createServerHelloDone = function(e) { var t = a.util.createBuffer(); return t.putByte(l.HandshakeType.server_hello_done), t.putInt24(0), t } , l.createChangeCipherSpec = function() { var e = a.util.createBuffer(); return e.putByte(1), e } , l.createFinished = function(e) { var t = a.util.createBuffer(); t.putBuffer(e.session.md5.digest()), t.putBuffer(e.session.sha1.digest()); var r = e.entity === l.ConnectionEnd.client , i = e.session.sp , s = n , o = r ? "client finished" : "server finished"; t = s(i.master_secret, o, t.getBytes(), 12); var c = a.util.createBuffer(); return c.putByte(l.HandshakeType.finished), c.putInt24(t.length()), c.putBuffer(t), c } , l.createHeartbeat = function(e, t, r) { void 0 === r && (r = t.length); var n = a.util.createBuffer(); n.putByte(e), n.putInt16(r), n.putBytes(t); var i = n.length() , s = Math.max(16, i - r - 3); return n.putBytes(a.random.getBytes(s)), n } , l.queue = function(e, t) { if (t && (0 !== t.fragment.length() || t.type !== l.ContentType.handshake && t.type !== l.ContentType.alert && t.type !== l.ContentType.change_cipher_spec)) { if (t.type === l.ContentType.handshake) { var r = t.fragment.bytes(); e.session.md5.update(r), e.session.sha1.update(r), r = null } var n; if (t.fragment.length() <= l.MaxFragment) n = [t]; else { n = []; for (var i = t.fragment.bytes(); i.length > l.MaxFragment; ) n.push(l.createRecord(e, { type: t.type, data: a.util.createBuffer(i.slice(0, l.MaxFragment)) })), i = i.slice(l.MaxFragment); i.length > 0 && n.push(l.createRecord(e, { type: t.type, data: a.util.createBuffer(i) })) } for (var s = 0; s < n.length && !e.fail; ++s) { var o = n[s]; e.state.current.write.update(e, o) && e.records.push(o) } } } , l.flush = function(e) { for (var t = 0; t < e.records.length; ++t) { var r = e.records[t]; e.tlsData.putByte(r.type), e.tlsData.putByte(r.version.major), e.tlsData.putByte(r.version.minor), e.tlsData.putInt16(r.fragment.length()), e.tlsData.putBuffer(e.records[t].fragment) } return e.records = [], e.tlsDataReady(e) } ; var j = function(e) { switch (e) { case !0: return !0; case a.pki.certificateError.bad_certificate: return l.Alert.Description.bad_certificate; case a.pki.certificateError.unsupported_certificate: return l.Alert.Description.unsupported_certificate; case a.pki.certificateError.certificate_revoked: return l.Alert.Description.certificate_revoked; case a.pki.certificateError.certificate_expired: return l.Alert.Description.certificate_expired; case a.pki.certificateError.certificate_unknown: return l.Alert.Description.certificate_unknown; case a.pki.certificateError.unknown_ca: return l.Alert.Description.unknown_ca; default: return l.Alert.Description.bad_certificate } } , G = function(e) { switch (e) { case !0: return !0; case l.Alert.Description.bad_certificate: return a.pki.certificateError.bad_certificate; case l.Alert.Description.unsupported_certificate: return a.pki.certificateError.unsupported_certificate; case l.Alert.Description.certificate_revoked: return a.pki.certificateError.certificate_revoked; case l.Alert.Description.certificate_expired: return a.pki.certificateError.certificate_expired; case l.Alert.Description.certificate_unknown: return a.pki.certificateError.certificate_unknown; case l.Alert.Description.unknown_ca: return a.pki.certificateError.unknown_ca; default: return a.pki.certificateError.bad_certificate } }; l.verifyCertificateChain = function(e, t) { try { var r = {}; for (var n in e.verifyOptions) r[n] = e.verifyOptions[n]; r.verify = function(t, r, n) { var i = (j(t), e.verify(e, t, r, n)); if (!0 !== i) { if ("object" == typeof i && !a.util.isArray(i)) { var s = new Error("The application rejected the certificate."); throw s.send = !0, s.alert = { level: l.Alert.Level.fatal, description: l.Alert.Description.bad_certificate }, i.message && (s.message = i.message), i.alert && (s.alert.description = i.alert), s } i !== t && (i = G(i)) } return i } , a.pki.verifyCertificateChain(e.caStore, t, r) } catch (t) { var i = t; ("object" != typeof i || a.util.isArray(i)) && (i = { send: !0, alert: { level: l.Alert.Level.fatal, description: j(t) } }), "send"in i || (i.send = !0), "alert"in i || (i.alert = { level: l.Alert.Level.fatal, description: j(i.error) }), e.error(e, i) } return !e.fail } , l.createSessionCache = function(e, t) { var r = null; if (e && e.getSession && e.setSession && e.order) r = e; else { r = {}, r.cache = e || {}, r.capacity = Math.max(t || 100, 1), r.order = []; for (var n in e) r.order.length <= t ? r.order.push(n) : delete e[n]; r.getSession = function(e) { var t = null , n = null; if (e ? n = a.util.bytesToHex(e) : r.order.length > 0 && (n = r.order[0]), null !== n && n in r.cache) { t = r.cache[n], delete r.cache[n]; for (var i in r.order) if (r.order[i] === n) { r.order.splice(i, 1); break } } return t } , r.setSession = function(e, t) { if (r.order.length === r.capacity) { var n = r.order.shift(); delete r.cache[n] } var n = a.util.bytesToHex(e); r.order.push(n), r.cache[n] = t } } return r } , l.createConnection = function(e) { var t = null; t = e.caStore ? a.util.isArray(e.caStore) ? a.pki.createCaStore(e.caStore) : e.caStore : a.pki.createCaStore(); var r = e.cipherSuites || null; if (null === r) { r = []; for (var n in l.CipherSuites) r.push(l.CipherSuites[n]) } var i = e.server ? l.ConnectionEnd.server : l.ConnectionEnd.client , s = e.sessionCache ? l.createSessionCache(e.sessionCache) : null , o = { version: { major: l.Version.major, minor: l.Version.minor }, entity: i, sessionId: e.sessionId, caStore: t, sessionCache: s, cipherSuites: r, connected: e.connected, virtualHost: e.virtualHost || null, verifyClient: e.verifyClient || !1, verify: e.verify || function(e, t, r, a) { return t } , verifyOptions: e.verifyOptions || {}, getCertificate: e.getCertificate || null, getPrivateKey: e.getPrivateKey || null, getSignature: e.getSignature || null, input: a.util.createBuffer(), tlsData: a.util.createBuffer(), data: a.util.createBuffer(), tlsDataReady: e.tlsDataReady, dataReady: e.dataReady, heartbeatReceived: e.heartbeatReceived, closed: e.closed, error: function(t, r) { r.origin = r.origin || (t.entity === l.ConnectionEnd.client ? "client" : "server"), r.send && (l.queue(t, l.createAlert(t, r.alert)), l.flush(t)); var a = !1 !== r.fatal; a && (t.fail = !0), e.error(t, r), a && t.close(!1) }, deflate: e.deflate || null, inflate: e.inflate || null }; o.reset = function(e) { o.version = { major: l.Version.major, minor: l.Version.minor }, o.record = null, o.session = null, o.peerCertificate = null, o.state = { pending: null, current: null }, o.expect = (o.entity, l.ConnectionEnd.client, 0), o.fragmented = null, o.records = [], o.open = !1, o.handshakes = 0, o.handshaking = !1, o.isConnected = !1, o.fail = !(e || void 0 === e), o.input.clear(), o.tlsData.clear(), o.data.clear(), o.state.current = l.createConnectionState(o) } , o.reset(); var c = function(e, t) { var r = t.type - l.ContentType.change_cipher_spec , a = _[e.entity][e.expect]; r in a ? a[r](e, t) : l.handleUnexpected(e, t) } , u = function(e) { var t = 0 , r = e.input , n = r.length(); if (n < 5) t = 5 - n; else { e.record = { type: r.getByte(), version: { major: r.getByte(), minor: r.getByte() }, length: r.getInt16(), fragment: a.util.createBuffer(), ready: !1 }; var i = e.record.version.major === e.version.major; i && e.session && e.session.version && (i = e.record.version.minor === e.version.minor), i || e.error(e, { message: "Incompatible TLS version.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.protocol_version } }) } return t } , p = function(e) { var t = 0 , r = e.input , a = r.length(); if (a < e.record.length) t = e.record.length - a; else { e.record.fragment.putBytes(r.getBytes(e.record.length)), r.compact(); e.state.current.read.update(e, e.record) && (null !== e.fragmented && (e.fragmented.type === e.record.type ? (e.fragmented.fragment.putBuffer(e.record.fragment), e.record = e.fragmented) : e.error(e, { message: "Invalid fragmented record.", send: !0, alert: { level: l.Alert.Level.fatal, description: l.Alert.Description.unexpected_message } })), e.record.ready = !0) } return t }; return o.handshake = function(e) { if (o.entity !== l.ConnectionEnd.client) o.error(o, { message: "Cannot initiate handshake as a server.", fatal: !1 }); else if (o.handshaking) o.error(o, { message: "Handshake already in progress.", fatal: !1 }); else { o.fail && !o.open && 0 === o.handshakes && (o.fail = !1), o.handshaking = !0, e = e || ""; var t = null; e.length > 0 && (o.sessionCache && (t = o.sessionCache.getSession(e)), null === t && (e = "")), 0 === e.length && o.sessionCache && null !== (t = o.sessionCache.getSession()) && (e = t.id), o.session = { id: e, version: null, cipherSuite: null, compressionMethod: null, serverCertificate: null, certificateRequest: null, clientCertificate: null, sp: {}, md5: a.md.md5.create(), sha1: a.md.sha1.create() }, t && (o.version = t.version, o.session.sp = t.sp), o.session.sp.client_random = l.createRandom().getBytes(), o.open = !0, l.queue(o, l.createRecord(o, { type: l.ContentType.handshake, data: l.createClientHello(o) })), l.flush(o) } } , o.process = function(e) { var t = 0; return e && o.input.putBytes(e), o.fail || (null !== o.record && o.record.ready && o.record.fragment.isEmpty() && (o.record = null), null === o.record && (t = u(o)), o.fail || null === o.record || o.record.ready || (t = p(o)), !o.fail && null !== o.record && o.record.ready && c(o, o.record)), t } , o.prepare = function(e) { return l.queue(o, l.createRecord(o, { type: l.ContentType.application_data, data: a.util.createBuffer(e) })), l.flush(o) } , o.prepareHeartbeatRequest = function(e, t) { return e instanceof a.util.ByteBuffer && (e = e.bytes()), void 0 === t && (t = e.length), o.expectedHeartbeatPayload = e, l.queue(o, l.createRecord(o, { type: l.ContentType.heartbeat, data: l.createHeartbeat(l.HeartbeatMessageType.heartbeat_request, e, t) })), l.flush(o) } , o.close = function(e) { if (!o.fail && o.sessionCache && o.session) { var t = { id: o.session.id, version: o.session.version, sp: o.session.sp }; t.sp.keys = null, o.sessionCache.setSession(t.id, t) } o.open && (o.open = !1, o.input.clear(), (o.isConnected || o.handshaking) && (o.isConnected = o.handshaking = !1, l.queue(o, l.createAlert(o, { level: l.Alert.Level.warning, description: l.Alert.Description.close_notify })), l.flush(o)), o.closed(o)), o.reset(e) } , o } , e.exports = a.tls = a.tls || {}; for (var H in l) "function" != typeof l[H] && (a.tls[H] = l[H]); a.tls.prf_tls1 = n, a.tls.hmac_sha1 = i, a.tls.createSessionCache = l.createSessionCache, a.tls.createConnection = l.createConnection } , function(e, t, r) { var a = r(0); r(3), r(6), r(22), r(7), r(15), r(28), r(18), r(11), r(1), r(17); var n = a.asn1 , i = e.exports = a.pki = a.pki || {}; i.pemToDer = function(e) { var t = a.pem.decode(e)[0]; if (t.procType && "ENCRYPTED" === t.procType.type) throw new Error("Could not convert PEM to DER; PEM is encrypted."); return a.util.createBuffer(t.body) } , i.privateKeyFromPem = function(e) { var t = a.pem.decode(e)[0]; if ("PRIVATE KEY" !== t.type && "RSA PRIVATE KEY" !== t.type) { var r = new Error('Could not convert private key from PEM; PEM header type is not "PRIVATE KEY" or "RSA PRIVATE KEY".'); throw r.headerType = t.type, r } if (t.procType && "ENCRYPTED" === t.procType.type) throw new Error("Could not convert private key from PEM; PEM is encrypted."); var s = n.fromDer(t.body); return i.privateKeyFromAsn1(s) } , i.privateKeyToPem = function(e, t) { var r = { type: "RSA PRIVATE KEY", body: n.toDer(i.privateKeyToAsn1(e)).getBytes() }; return a.pem.encode(r, { maxline: t }) } , i.privateKeyInfoToPem = function(e, t) { var r = { type: "PRIVATE KEY", body: n.toDer(e).getBytes() }; return a.pem.encode(r, { maxline: t }) } } , function(e, t, r) { function a(e, t) { return e.start().update(t).digest().getBytes() } function n(e) { var t; if (e) { if (!(t = l.oids[u.derToOid(e)])) { var r = new Error("Unsupported PRF OID."); throw r.oid = e, r.supported = ["hmacWithSHA1", "hmacWithSHA224", "hmacWithSHA256", "hmacWithSHA384", "hmacWithSHA512"], r } } else t = "hmacWithSHA1"; return i(t) } function i(e) { var t = o.md; switch (e) { case "hmacWithSHA224": t = o.md.sha512; case "hmacWithSHA1": case "hmacWithSHA256": case "hmacWithSHA384": case "hmacWithSHA512": e = e.substr(8).toLowerCase(); break; default: var r = new Error("Unsupported PRF algorithm."); throw r.algorithm = e, r.supported = ["hmacWithSHA1", "hmacWithSHA224", "hmacWithSHA256", "hmacWithSHA384", "hmacWithSHA512"], r } if (!(t && e in t)) throw new Error("Unknown hash algorithm: " + e); return t[e].create() } function s(e, t, r, a) { var n = u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, e), u.create(u.Class.UNIVERSAL, u.Type.INTEGER, !1, t.getBytes())]); return "hmacWithSHA1" !== a && n.value.push(u.create(u.Class.UNIVERSAL, u.Type.INTEGER, !1, o.util.hexToBytes(r.toString(16))), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(l.oids[a]).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.NULL, !1, "")])), n } var o = r(0); if (r(5), r(3), r(10), r(4), r(6), r(15), r(7), r(2), r(25), r(11), r(1), void 0 === c) var c = o.jsbn.BigInteger; var u = o.asn1 , l = o.pki = o.pki || {}; e.exports = l.pbe = o.pbe = o.pbe || {}; var p = l.oids , f = { name: "EncryptedPrivateKeyInfo", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "EncryptedPrivateKeyInfo.encryptionAlgorithm", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "AlgorithmIdentifier.algorithm", tagClass: u.Class.UNIVERSAL, type: u.Type.OID, constructed: !1, capture: "encryptionOid" }, { name: "AlgorithmIdentifier.parameters", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, captureAsn1: "encryptionParams" }] }, { name: "EncryptedPrivateKeyInfo.encryptedData", tagClass: u.Class.UNIVERSAL, type: u.Type.OCTETSTRING, constructed: !1, capture: "encryptedData" }] } , h = { name: "PBES2Algorithms", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "PBES2Algorithms.keyDerivationFunc", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "PBES2Algorithms.keyDerivationFunc.oid", tagClass: u.Class.UNIVERSAL, type: u.Type.OID, constructed: !1, capture: "kdfOid" }, { name: "PBES2Algorithms.params", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "PBES2Algorithms.params.salt", tagClass: u.Class.UNIVERSAL, type: u.Type.OCTETSTRING, constructed: !1, capture: "kdfSalt" }, { name: "PBES2Algorithms.params.iterationCount", tagClass: u.Class.UNIVERSAL, type: u.Type.INTEGER, constructed: !1, capture: "kdfIterationCount" }, { name: "PBES2Algorithms.params.keyLength", tagClass: u.Class.UNIVERSAL, type: u.Type.INTEGER, constructed: !1, optional: !0, capture: "keyLength" }, { name: "PBES2Algorithms.params.prf", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, optional: !0, value: [{ name: "PBES2Algorithms.params.prf.algorithm", tagClass: u.Class.UNIVERSAL, type: u.Type.OID, constructed: !1, capture: "prfOid" }] }] }] }, { name: "PBES2Algorithms.encryptionScheme", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "PBES2Algorithms.encryptionScheme.oid", tagClass: u.Class.UNIVERSAL, type: u.Type.OID, constructed: !1, capture: "encOid" }, { name: "PBES2Algorithms.encryptionScheme.iv", tagClass: u.Class.UNIVERSAL, type: u.Type.OCTETSTRING, constructed: !1, capture: "encIv" }] }] } , d = { name: "pkcs-12PbeParams", tagClass: u.Class.UNIVERSAL, type: u.Type.SEQUENCE, constructed: !0, value: [{ name: "pkcs-12PbeParams.salt", tagClass: u.Class.UNIVERSAL, type: u.Type.OCTETSTRING, constructed: !1, capture: "salt" }, { name: "pkcs-12PbeParams.iterations", tagClass: u.Class.UNIVERSAL, type: u.Type.INTEGER, constructed: !1, capture: "iterations" }] }; l.encryptPrivateKeyInfo = function(e, t, r) { r = r || {}, r.saltSize = r.saltSize || 8, r.count = r.count || 2048, r.algorithm = r.algorithm || "aes128", r.prfAlgorithm = r.prfAlgorithm || "sha1"; var a, n, c, f = o.random.getBytesSync(r.saltSize), h = r.count, d = u.integerToDer(h); if (0 === r.algorithm.indexOf("aes") || "des" === r.algorithm) { var y, g, v; switch (r.algorithm) { case "aes128": a = 16, y = 16, g = p["aes128-CBC"], v = o.aes.createEncryptionCipher; break; case "aes192": a = 24, y = 16, g = p["aes192-CBC"], v = o.aes.createEncryptionCipher; break; case "aes256": a = 32, y = 16, g = p["aes256-CBC"], v = o.aes.createEncryptionCipher; break; case "des": a = 8, y = 8, g = p.desCBC, v = o.des.createEncryptionCipher; break; default: var m = new Error("Cannot encrypt private key. Unknown encryption algorithm."); throw m.algorithm = r.algorithm, m } var C = "hmacWith" + r.prfAlgorithm.toUpperCase() , E = i(C) , S = o.pkcs5.pbkdf2(t, f, h, a, E) , T = o.random.getBytesSync(y) , I = v(S); I.start(T), I.update(u.toDer(e)), I.finish(), c = I.output.getBytes(); var b = s(f, d, a, C); n = u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(p.pkcs5PBES2).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(p.pkcs5PBKDF2).getBytes()), b]), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(g).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, T)])])]) } else { if ("3des" !== r.algorithm) { var m = new Error("Cannot encrypt private key. Unknown encryption algorithm."); throw m.algorithm = r.algorithm, m } a = 24; var A = new o.util.ByteBuffer(f) , S = l.pbe.generatePkcs12Key(t, A, 1, h, a) , T = l.pbe.generatePkcs12Key(t, A, 2, h, a) , I = o.des.createEncryptionCipher(S); I.start(T), I.update(u.toDer(e)), I.finish(), c = I.output.getBytes(), n = u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OID, !1, u.oidToDer(p["pbeWithSHAAnd3-KeyTripleDES-CBC"]).getBytes()), u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, f), u.create(u.Class.UNIVERSAL, u.Type.INTEGER, !1, d.getBytes())])]) } return u.create(u.Class.UNIVERSAL, u.Type.SEQUENCE, !0, [n, u.create(u.Class.UNIVERSAL, u.Type.OCTETSTRING, !1, c)]) } , l.decryptPrivateKeyInfo = function(e, t) { var r = null , a = {} , n = []; if (!u.validate(e, f, a, n)) { var i = new Error("Cannot read encrypted private key. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); throw i.errors = n, i } var s = u.derToOid(a.encryptionOid) , c = l.pbe.getCipher(s, a.encryptionParams, t) , p = o.util.createBuffer(a.encryptedData); return c.update(p), c.finish() && (r = u.fromDer(c.output)), r } , l.encryptedPrivateKeyToPem = function(e, t) { var r = { type: "ENCRYPTED PRIVATE KEY", body: u.toDer(e).getBytes() }; return o.pem.encode(r, { maxline: t }) } , l.encryptedPrivateKeyFromPem = function(e) { var t = o.pem.decode(e)[0]; if ("ENCRYPTED PRIVATE KEY" !== t.type) { var r = new Error('Could not convert encrypted private key from PEM; PEM header type is "ENCRYPTED PRIVATE KEY".'); throw r.headerType = t.type, r } if (t.procType && "ENCRYPTED" === t.procType.type) throw new Error("Could not convert encrypted private key from PEM; PEM is encrypted."); return u.fromDer(t.body) } , l.encryptRsaPrivateKey = function(e, t, r) { if (r = r || {}, !r.legacy) { var a = l.wrapRsaPrivateKey(l.privateKeyToAsn1(e)); return a = l.encryptPrivateKeyInfo(a, t, r), l.encryptedPrivateKeyToPem(a) } var n, i, s, c; switch (r.algorithm) { case "aes128": n = "AES-128-CBC", s = 16, i = o.random.getBytesSync(16), c = o.aes.createEncryptionCipher; break; case "aes192": n = "AES-192-CBC", s = 24, i = o.random.getBytesSync(16), c = o.aes.createEncryptionCipher; break; case "aes256": n = "AES-256-CBC", s = 32, i = o.random.getBytesSync(16), c = o.aes.createEncryptionCipher; break; case "3des": n = "DES-EDE3-CBC", s = 24, i = o.random.getBytesSync(8), c = o.des.createEncryptionCipher; break; case "des": n = "DES-CBC", s = 8, i = o.random.getBytesSync(8), c = o.des.createEncryptionCipher; break; default: var p = new Error('Could not encrypt RSA private key; unsupported encryption algorithm "' + r.algorithm + '".'); throw p.algorithm = r.algorithm, p } var f = o.pbe.opensslDeriveBytes(t, i.substr(0, 8), s) , h = c(f); h.start(i), h.update(u.toDer(l.privateKeyToAsn1(e))), h.finish(); var d = { type: "RSA PRIVATE KEY", procType: { version: "4", type: "ENCRYPTED" }, dekInfo: { algorithm: n, parameters: o.util.bytesToHex(i).toUpperCase() }, body: h.output.getBytes() }; return o.pem.encode(d) } , l.decryptRsaPrivateKey = function(e, t) { var r = null , a = o.pem.decode(e)[0]; if ("ENCRYPTED PRIVATE KEY" !== a.type && "PRIVATE KEY" !== a.type && "RSA PRIVATE KEY" !== a.type) { var n = new Error('Could not convert private key from PEM; PEM header type is not "ENCRYPTED PRIVATE KEY", "PRIVATE KEY", or "RSA PRIVATE KEY".'); throw n.headerType = n, n } if (a.procType && "ENCRYPTED" === a.procType.type) { var i, s; switch (a.dekInfo.algorithm) { case "DES-CBC": i = 8, s = o.des.createDecryptionCipher; break; case "DES-EDE3-CBC": i = 24, s = o.des.createDecryptionCipher; break; case "AES-128-CBC": i = 16, s = o.aes.createDecryptionCipher; break; case "AES-192-CBC": i = 24, s = o.aes.createDecryptionCipher; break; case "AES-256-CBC": i = 32, s = o.aes.createDecryptionCipher; break; case "RC2-40-CBC": i = 5, s = function(e) { return o.rc2.createDecryptionCipher(e, 40) } ; break; case "RC2-64-CBC": i = 8, s = function(e) { return o.rc2.createDecryptionCipher(e, 64) } ; break; case "RC2-128-CBC": i = 16, s = function(e) { return o.rc2.createDecryptionCipher(e, 128) } ; break; default: var n = new Error('Could not decrypt private key; unsupported encryption algorithm "' + a.dekInfo.algorithm + '".'); throw n.algorithm = a.dekInfo.algorithm, n } var c = o.util.hexToBytes(a.dekInfo.parameters) , p = o.pbe.opensslDeriveBytes(t, c.substr(0, 8), i) , f = s(p); if (f.start(c), f.update(o.util.createBuffer(a.body)), !f.finish()) return r; r = f.output.getBytes() } else r = a.body; return r = "ENCRYPTED PRIVATE KEY" === a.type ? l.decryptPrivateKeyInfo(u.fromDer(r), t) : u.fromDer(r), null !== r && (r = l.privateKeyFromAsn1(r)), r } , l.pbe.generatePkcs12Key = function(e, t, r, a, n, i) { var s, c; if (void 0 === i || null === i) { if (!("sha1"in o.md)) throw new Error('"sha1" hash algorithm unavailable.'); i = o.md.sha1.create() } var u = i.digestLength , l = i.blockLength , p = new o.util.ByteBuffer , f = new o.util.ByteBuffer; if (null !== e && void 0 !== e) { for (c = 0; c < e.length; c++) f.putInt16(e.charCodeAt(c)); f.putInt16(0) } var h = f.length() , d = t.length() , y = new o.util.ByteBuffer; y.fillWithByte(r, l); var g = l * Math.ceil(d / l) , v = new o.util.ByteBuffer; for (c = 0; c < g; c++) v.putByte(t.at(c % d)); var m = l * Math.ceil(h / l) , C = new o.util.ByteBuffer; for (c = 0; c < m; c++) C.putByte(f.at(c % h)); var E = v; E.putBuffer(C); for (var S = Math.ceil(n / u), T = 1; T <= S; T++) { var I = new o.util.ByteBuffer; I.putBytes(y.bytes()), I.putBytes(E.bytes()); for (var b = 0; b < a; b++) i.start(), i.update(I.getBytes()), I = i.digest(); var A = new o.util.ByteBuffer; for (c = 0; c < l; c++) A.putByte(I.at(c % u)); var B = Math.ceil(d / l) + Math.ceil(h / l) , N = new o.util.ByteBuffer; for (s = 0; s < B; s++) { var k = new o.util.ByteBuffer(E.getBytes(l)) , w = 511; for (c = A.length() - 1; c >= 0; c--) w >>= 8, w += A.at(c) + k.at(c), k.setAt(c, 255 & w); N.putBuffer(k) } E = N, p.putBuffer(I) } return p.truncate(p.length() - n), p } , l.pbe.getCipher = function(e, t, r) { switch (e) { case l.oids.pkcs5PBES2: return l.pbe.getCipherForPBES2(e, t, r); case l.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]: case l.oids["pbewithSHAAnd40BitRC2-CBC"]: return l.pbe.getCipherForPKCS12PBE(e, t, r); default: var a = new Error("Cannot read encrypted PBE data block. Unsupported OID."); throw a.oid = e, a.supportedOids = ["pkcs5PBES2", "pbeWithSHAAnd3-KeyTripleDES-CBC", "pbewithSHAAnd40BitRC2-CBC"], a } } , l.pbe.getCipherForPBES2 = function(e, t, r) { var a = {} , i = []; if (!u.validate(t, h, a, i)) { var s = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); throw s.errors = i, s } if ((e = u.derToOid(a.kdfOid)) !== l.oids.pkcs5PBKDF2) { var s = new Error("Cannot read encrypted private key. Unsupported key derivation function OID."); throw s.oid = e, s.supportedOids = ["pkcs5PBKDF2"], s } if ((e = u.derToOid(a.encOid)) !== l.oids["aes128-CBC"] && e !== l.oids["aes192-CBC"] && e !== l.oids["aes256-CBC"] && e !== l.oids["des-EDE3-CBC"] && e !== l.oids.desCBC) { var s = new Error("Cannot read encrypted private key. Unsupported encryption scheme OID."); throw s.oid = e, s.supportedOids = ["aes128-CBC", "aes192-CBC", "aes256-CBC", "des-EDE3-CBC", "desCBC"], s } var c = a.kdfSalt , p = o.util.createBuffer(a.kdfIterationCount); p = p.getInt(p.length() << 3); var f, d; switch (l.oids[e]) { case "aes128-CBC": f = 16, d = o.aes.createDecryptionCipher; break; case "aes192-CBC": f = 24, d = o.aes.createDecryptionCipher; break; case "aes256-CBC": f = 32, d = o.aes.createDecryptionCipher; break; case "des-EDE3-CBC": f = 24, d = o.des.createDecryptionCipher; break; case "desCBC": f = 8, d = o.des.createDecryptionCipher } var y = n(a.prfOid) , g = o.pkcs5.pbkdf2(r, c, p, f, y) , v = a.encIv , m = d(g); return m.start(v), m } , l.pbe.getCipherForPKCS12PBE = function(e, t, r) { var a = {} , i = []; if (!u.validate(t, d, a, i)) { var s = new Error("Cannot read password-based-encryption algorithm parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo."); throw s.errors = i, s } var c = o.util.createBuffer(a.salt) , p = o.util.createBuffer(a.iterations); p = p.getInt(p.length() << 3); var f, h, y; switch (e) { case l.oids["pbeWithSHAAnd3-KeyTripleDES-CBC"]: f = 24, h = 8, y = o.des.startDecrypting; break; case l.oids["pbewithSHAAnd40BitRC2-CBC"]: f = 5, h = 8, y = function(e, t) { var r = o.rc2.createDecryptionCipher(e, 40); return r.start(t, null), r } ; break; default: var s = new Error("Cannot read PKCS #12 PBE data block. Unsupported OID."); throw s.oid = e, s } var g = n(a.prfOid) , v = l.pbe.generatePkcs12Key(r, c, 1, p, f, g); return g.start(), y(v, l.pbe.generatePkcs12Key(r, c, 2, p, h, g)) } , l.pbe.opensslDeriveBytes = function(e, t, r, n) { if (void 0 === n || null === n) { if (!("md5"in o.md)) throw new Error('"md5" hash algorithm unavailable.'); n = o.md.md5.create() } null === t && (t = ""); for (var i = [a(n, e + t)], s = 16, c = 1; s < r; ++c, s += 16) i.push(a(n, i[c - 1] + e + t)); return i.join("").substr(0, r) } } , function(e, t, r) { function a() { o = String.fromCharCode(128), o += i.util.fillString(String.fromCharCode(0), 64), u = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298], c = !0 } function n(e, t, r) { for (var a, n, i, s, o, c, l, p, f, h, d, y, g, v, m, C = r.length(); C >= 64; ) { for (l = 0; l < 16; ++l) t[l] = r.getInt32(); for (; l < 64; ++l) a = t[l - 2], a = (a >>> 17 | a << 15) ^ (a >>> 19 | a << 13) ^ a >>> 10, n = t[l - 15], n = (n >>> 7 | n << 25) ^ (n >>> 18 | n << 14) ^ n >>> 3, t[l] = a + t[l - 7] + n + t[l - 16] | 0; for (p = e.h0, f = e.h1, h = e.h2, d = e.h3, y = e.h4, g = e.h5, v = e.h6, m = e.h7, l = 0; l < 64; ++l) s = (y >>> 6 | y << 26) ^ (y >>> 11 | y << 21) ^ (y >>> 25 | y << 7), o = v ^ y & (g ^ v), i = (p >>> 2 | p << 30) ^ (p >>> 13 | p << 19) ^ (p >>> 22 | p << 10), c = p & f | h & (p ^ f), a = m + s + o + u[l] + t[l], n = i + c, m = v, v = g, g = y, y = d + a >>> 0, d = h, h = f, f = p, p = a + n >>> 0; e.h0 = e.h0 + p | 0, e.h1 = e.h1 + f | 0, e.h2 = e.h2 + h | 0, e.h3 = e.h3 + d | 0, e.h4 = e.h4 + y | 0, e.h5 = e.h5 + g | 0, e.h6 = e.h6 + v | 0, e.h7 = e.h7 + m | 0, C -= 64 } } var i = r(0); r(4), r(1); var s = e.exports = i.sha256 = i.sha256 || {}; i.md.sha256 = i.md.algorithms.sha256 = s, s.create = function() { c || a(); var e = null , t = i.util.createBuffer() , r = new Array(64) , s = { algorithm: "sha256", blockLength: 64, digestLength: 32, messageLength: 0, fullMessageLength: null, messageLengthSize: 8 }; return s.start = function() { s.messageLength = 0, s.fullMessageLength = s.messageLength64 = []; for (var r = s.messageLengthSize / 4, a = 0; a < r; ++a) s.fullMessageLength.push(0); return t = i.util.createBuffer(), e = { h0: 1779033703, h1: 3144134277, h2: 1013904242, h3: 2773480762, h4: 1359893119, h5: 2600822924, h6: 528734635, h7: 1541459225 }, s } , s.start(), s.update = function(a, o) { "utf8" === o && (a = i.util.encodeUtf8(a)); var c = a.length; s.messageLength += c, c = [c / 4294967296 >>> 0, c >>> 0]; for (var u = s.fullMessageLength.length - 1; u >= 0; --u) s.fullMessageLength[u] += c[1], c[1] = c[0] + (s.fullMessageLength[u] / 4294967296 >>> 0), s.fullMessageLength[u] = s.fullMessageLength[u] >>> 0, c[0] = c[1] / 4294967296 >>> 0; return t.putBytes(a), n(e, r, t), (t.read > 2048 || 0 === t.length()) && t.compact(), s } , s.digest = function() { var a = i.util.createBuffer(); a.putBytes(t.bytes()); var c = s.fullMessageLength[s.fullMessageLength.length - 1] + s.messageLengthSize , u = c & s.blockLength - 1; a.putBytes(o.substr(0, s.blockLength - u)); for (var l, p, f = 8 * s.fullMessageLength[0], h = 0; h < s.fullMessageLength.length - 1; ++h) l = 8 * s.fullMessageLength[h + 1], p = l / 4294967296 >>> 0, f += p, a.putInt32(f >>> 0), f = l >>> 0; a.putInt32(f); var d = { h0: e.h0, h1: e.h1, h2: e.h2, h3: e.h3, h4: e.h4, h5: e.h5, h6: e.h6, h7: e.h7 }; n(d, r, a); var y = i.util.createBuffer(); return y.putInt32(d.h0), y.putInt32(d.h1), y.putInt32(d.h2), y.putInt32(d.h3), y.putInt32(d.h4), y.putInt32(d.h5), y.putInt32(d.h6), y.putInt32(d.h7), y } , s } ; var o = null , c = !1 , u = null } , function(e, t, r) { var a = r(0); r(1); var n = null; !a.util.isNodejs || a.options.usePureJavaScript || process.versions["node-webkit"] || (n = r(16)), (e.exports = a.prng = a.prng || {}).create = function(e) { function t(e) { if (o.pools[0].messageLength >= 32) return i(), e(); var t = 32 - o.pools[0].messageLength << 5; o.seedFile(t, function(t, r) { if (t) return e(t); o.collect(r), i(), e() }) } function r() { if (o.pools[0].messageLength >= 32) return i(); var e = 32 - o.pools[0].messageLength << 5; o.collect(o.seedFileSync(e)), i() } function i() { o.reseeds = 4294967295 === o.reseeds ? 0 : o.reseeds + 1; var e = o.plugin.md.create(); e.update(o.keyBytes); for (var t = 1, r = 0; r < 32; ++r) o.reseeds % t == 0 && (e.update(o.pools[r].digest().getBytes()), o.pools[r].start()), t <<= 1; o.keyBytes = e.digest().getBytes(), e.start(), e.update(o.keyBytes); var a = e.digest().getBytes(); o.key = o.plugin.formatKey(o.keyBytes), o.seed = o.plugin.formatSeed(a), o.generated = 0 } function s(e) { var t = null , r = a.util.globalScope , n = r.crypto || r.msCrypto; n && n.getRandomValues && (t = function(e) { return n.getRandomValues(e) } ); var i = a.util.createBuffer(); if (t) for (; i.length() < e; ) { var s = Math.max(1, Math.min(e - i.length(), 65536) / 4) , o = new Uint32Array(Math.floor(s)); try { t(o); for (var c = 0; c < o.length; ++c) i.putInt32(o[c]) } catch (e) { if (!("undefined" != typeof QuotaExceededError && e instanceof QuotaExceededError)) throw e } } if (i.length() < e) for (var u, l, p, f = Math.floor(65536 * Math.random()); i.length() < e; ) { l = 16807 * (65535 & f), u = 16807 * (f >> 16), l += (32767 & u) << 16, l += u >> 15, l = (2147483647 & l) + (l >> 31), f = 4294967295 & l; for (var c = 0; c < 3; ++c) p = f >>> (c << 3), p ^= Math.floor(256 * Math.random()), i.putByte(String.fromCharCode(255 & p)) } return i.getBytes(e) } for (var o = { plugin: e, key: null, seed: null, time: null, reseeds: 0, generated: 0, keyBytes: "" }, c = e.md, u = new Array(32), l = 0; l < 32; ++l) u[l] = c.create(); return o.pools = u, o.pool = 0, o.generate = function(e, r) { function n(p) { if (p) return r(p); if (l.length() >= e) return r(null, l.getBytes(e)); if (o.generated > 1048575 && (o.key = null), null === o.key) return a.util.nextTick(function() { t(n) }); var f = i(o.key, o.seed); o.generated += f.length, l.putBytes(f), o.key = c(i(o.key, s(o.seed))), o.seed = u(i(o.key, o.seed)), a.util.setImmediate(n) } if (!r) return o.generateSync(e); var i = o.plugin.cipher , s = o.plugin.increment , c = o.plugin.formatKey , u = o.plugin.formatSeed , l = a.util.createBuffer(); o.key = null, n() } , o.generateSync = function(e) { var t = o.plugin.cipher , n = o.plugin.increment , i = o.plugin.formatKey , s = o.plugin.formatSeed; o.key = null; for (var c = a.util.createBuffer(); c.length() < e; ) { o.generated > 1048575 && (o.key = null), null === o.key && r(); var u = t(o.key, o.seed); o.generated += u.length, c.putBytes(u), o.key = i(t(o.key, n(o.seed))), o.seed = s(t(o.key, o.seed)) } return c.getBytes(e) } , n ? (o.seedFile = function(e, t) { n.randomBytes(e, function(e, r) { if (e) return t(e); t(null, r.toString()) }) } , o.seedFileSync = function(e) { return n.randomBytes(e).toString() } ) : (o.seedFile = function(e, t) { try { t(null, s(e)) } catch (e) { t(e) } } , o.seedFileSync = s), o.collect = function(e) { for (var t = e.length, r = 0; r < t; ++r) o.pools[o.pool].update(e.substr(r, 1)), o.pool = 31 === o.pool ? 0 : o.pool + 1 } , o.collectInt = function(e, t) { for (var r = "", a = 0; a < t; a += 8) r += String.fromCharCode(e >> a & 255); o.collect(r) } , o.registerWorker = function(e) { if (e === self) o.seedFile = function(e, t) { function r(e) { var a = e.data; a.forge && a.forge.prng && (self.removeEventListener("message", r), t(a.forge.prng.err, a.forge.prng.bytes)) } self.addEventListener("message", r), self.postMessage({ forge: { prng: { needed: e } } }) } ; else { var t = function(t) { var r = t.data; r.forge && r.forge.prng && o.seedFile(r.forge.prng.needed, function(t, r) { e.postMessage({ forge: { prng: { err: t, bytes: r } } }) }) }; e.addEventListener("message", t) } } , o } } , function(e, t, r) { var a = r(0); r(1); var n = [217, 120, 249, 196, 25, 221, 181, 237, 40, 233, 253, 121, 74, 160, 216, 157, 198, 126, 55, 131, 43, 118, 83, 142, 98, 76, 100, 136, 68, 139, 251, 162, 23, 154, 89, 245, 135, 179, 79, 19, 97, 69, 109, 141, 9, 129, 125, 50, 189, 143, 64, 235, 134, 183, 123, 11, 240, 149, 33, 34, 92, 107, 78, 130, 84, 214, 101, 147, 206, 96, 178, 28, 115, 86, 192, 20, 167, 140, 241, 220, 18, 117, 202, 31, 59, 190, 228, 209, 66, 61, 212, 48, 163, 60, 182, 38, 111, 191, 14, 218, 70, 105, 7, 87, 39, 242, 29, 155, 188, 148, 67, 3, 248, 17, 199, 246, 144, 239, 62, 231, 6, 195, 213, 47, 200, 102, 30, 215, 8, 232, 234, 222, 128, 82, 238, 247, 132, 170, 114, 172, 53, 77, 106, 42, 150, 26, 210, 113, 90, 21, 73, 116, 75, 159, 208, 94, 4, 24, 164, 236, 194, 224, 65, 110, 15, 81, 203, 204, 36, 145, 175, 80, 161, 244, 112, 57, 153, 124, 58, 133, 35, 184, 180, 122, 252, 2, 54, 91, 37, 85, 151, 49, 45, 93, 250, 152, 227, 138, 146, 174, 5, 223, 41, 16, 103, 108, 186, 201, 211, 0, 230, 207, 225, 158, 168, 44, 99, 22, 1, 63, 88, 226, 137, 169, 13, 56, 52, 27, 171, 51, 255, 176, 187, 72, 12, 95, 185, 177, 205, 46, 197, 243, 219, 71, 229, 165, 156, 119, 10, 166, 32, 104, 254, 127, 193, 173] , i = [1, 2, 3, 5] , s = function(e, t) { return e << t & 65535 | (65535 & e) >> 16 - t } , o = function(e, t) { return (65535 & e) >> t | e << 16 - t & 65535 }; e.exports = a.rc2 = a.rc2 || {}, a.rc2.expandKey = function(e, t) { "string" == typeof e && (e = a.util.createBuffer(e)), t = t || 128; var r, i = e, s = e.length(), o = t, c = Math.ceil(o / 8), u = 255 >> (7 & o); for (r = s; r < 128; r++) i.putByte(n[i.at(r - 1) + i.at(r - s) & 255]); for (i.setAt(128 - c, n[i.at(128 - c) & u]), r = 127 - c; r >= 0; r--) i.setAt(r, n[i.at(r + 1) ^ i.at(r + c)]); return i } ; var c = function(e, t, r) { var n, c, u, l, p = !1, f = null, h = null, d = null, y = []; for (e = a.rc2.expandKey(e, t), u = 0; u < 64; u++) y.push(e.getInt16Le()); r ? (n = function(e) { for (u = 0; u < 4; u++) e[u] += y[l] + (e[(u + 3) % 4] & e[(u + 2) % 4]) + (~e[(u + 3) % 4] & e[(u + 1) % 4]), e[u] = s(e[u], i[u]), l++ } , c = function(e) { for (u = 0; u < 4; u++) e[u] += y[63 & e[(u + 3) % 4]] } ) : (n = function(e) { for (u = 3; u >= 0; u--) e[u] = o(e[u], i[u]), e[u] -= y[l] + (e[(u + 3) % 4] & e[(u + 2) % 4]) + (~e[(u + 3) % 4] & e[(u + 1) % 4]), l-- } , c = function(e) { for (u = 3; u >= 0; u--) e[u] -= y[63 & e[(u + 3) % 4]] } ); var g = function(e) { var t = []; for (u = 0; u < 4; u++) { var a = f.getInt16Le(); null !== d && (r ? a ^= d.getInt16Le() : d.putInt16Le(a)), t.push(65535 & a) } l = r ? 0 : 63; for (var n = 0; n < e.length; n++) for (var i = 0; i < e[n][0]; i++) e[n][1](t); for (u = 0; u < 4; u++) null !== d && (r ? d.putInt16Le(t[u]) : t[u] ^= d.getInt16Le()), h.putInt16Le(t[u]) } , v = null; return v = { start: function(e, t) { e && "string" == typeof e && (e = a.util.createBuffer(e)), p = !1, f = a.util.createBuffer(), h = t || new a.util.createBuffer, d = e, v.output = h }, update: function(e) { for (p || f.putBuffer(e); f.length() >= 8; ) g([[5, n], [1, c], [6, n], [1, c], [5, n]]) }, finish: function(e) { var t = !0; if (r) if (e) t = e(8, f, !r); else { var a = 8 === f.length() ? 8 : 8 - f.length(); f.fillWithByte(a, a) } if (t && (p = !0, v.update()), !r && (t = 0 === f.length())) if (e) t = e(8, h, !r); else { var n = h.length() , i = h.at(n - 1); i > n ? t = !1 : h.truncate(i) } return t } } }; a.rc2.startEncrypting = function(e, t, r) { var n = a.rc2.createEncryptionCipher(e, 128); return n.start(t, r), n } , a.rc2.createEncryptionCipher = function(e, t) { return c(e, t, !0) } , a.rc2.startDecrypting = function(e, t, r) { var n = a.rc2.createDecryptionCipher(e, 128); return n.start(t, r), n } , a.rc2.createDecryptionCipher = function(e, t) { return c(e, t, !1) } } , function(e, t, r) { function a(e, t, r) { r || (r = n.md.sha1.create()); for (var a = "", i = Math.ceil(t / r.digestLength), s = 0; s < i; ++s) { var o = String.fromCharCode(s >> 24 & 255, s >> 16 & 255, s >> 8 & 255, 255 & s); r.start(), r.update(e + o), a += r.digest().getBytes() } return a.substring(0, t) } var n = r(0); r(1), r(2), r(9); var i = e.exports = n.pkcs1 = n.pkcs1 || {}; i.encode_rsa_oaep = function(e, t, r) { var i, s, o, c; "string" == typeof r ? (i = r, s = arguments[3] || void 0, o = arguments[4] || void 0) : r && (i = r.label || void 0, s = r.seed || void 0, o = r.md || void 0, r.mgf1 && r.mgf1.md && (c = r.mgf1.md)), o ? o.start() : o = n.md.sha1.create(), c || (c = o); var u = Math.ceil(e.n.bitLength() / 8) , l = u - 2 * o.digestLength - 2; if (t.length > l) { var p = new Error("RSAES-OAEP input message length is too long."); throw p.length = t.length, p.maxLength = l, p } i || (i = ""), o.update(i, "raw"); for (var f = o.digest(), h = "", d = l - t.length, y = 0; y < d; y++) h += "\0"; var g = f.getBytes() + h + "" + t; if (s) { if (s.length !== o.digestLength) { var p = new Error("Invalid RSAES-OAEP seed. The seed length must match the digest length."); throw p.seedLength = s.length, p.digestLength = o.digestLength, p } } else s = n.random.getBytes(o.digestLength); var v = a(s, u - o.digestLength - 1, c) , m = n.util.xorBytes(g, v, g.length) , C = a(m, o.digestLength, c); return "\0" + n.util.xorBytes(s, C, s.length) + m } , i.decode_rsa_oaep = function(e, t, r) { var i, s, o; "string" == typeof r ? (i = r, s = arguments[3] || void 0) : r && (i = r.label || void 0, s = r.md || void 0, r.mgf1 && r.mgf1.md && (o = r.mgf1.md)); var c = Math.ceil(e.n.bitLength() / 8); if (t.length !== c) { var u = new Error("RSAES-OAEP encoded message length is invalid."); throw u.length = t.length, u.expectedLength = c, u } if (void 0 === s ? s = n.md.sha1.create() : s.start(), o || (o = s), c < 2 * s.digestLength + 2) throw new Error("RSAES-OAEP key is too short for the hash function."); i || (i = ""), s.update(i, "raw"); for (var l = s.digest().getBytes(), p = t.charAt(0), f = t.substring(1, s.digestLength + 1), h = t.substring(1 + s.digestLength), d = a(h, s.digestLength, o), y = n.util.xorBytes(f, d, f.length), g = a(y, c - s.digestLength - 1, o), v = n.util.xorBytes(h, g, h.length), m = v.substring(0, s.digestLength), u = "\0" !== p, C = 0; C < s.digestLength; ++C) u |= l.charAt(C) !== m.charAt(C); for (var E = 1, S = s.digestLength, T = s.digestLength; T < v.length; T++) { var I = v.charCodeAt(T) , b = 1 & I ^ 1; u |= I & (E ? 65534 : 0), E &= b, S += E } if (u || 1 !== v.charCodeAt(S)) throw new Error("Invalid RSAES-OAEP padding."); return v.substring(S + 1) } } , function(e, t, r) { var a = r(0); r(1), r(12), r(2), function() { function t(e, t, a, n) { return "workers"in a ? i(e, t, a, n) : r(e, t, a, n) } function r(e, t, r, a) { var i = s(e, t) , c = o(i.bitLength()); "millerRabinTests"in r && (c = r.millerRabinTests); var u = 10; "maxBlockTime"in r && (u = r.maxBlockTime), n(i, e, t, 0, c, u, a) } function n(e, t, r, i, o, c, u) { var p = +new Date; do { if (e.bitLength() > t && (e = s(t, r)), e.isProbablePrime(o)) return u(null, e); e.dAddOffset(l[i++ % 8], 0) } while (c < 0 || +new Date - p < c); a.util.setImmediate(function() { n(e, t, r, i, o, c, u) }) } function i(e, t, n, i) { function o() { function r(r) { if (!d) { --o; var n = r.data; if (n.found) { for (var l = 0; l < a.length; ++l) a[l].terminate(); return d = !0, i(null, new u(n.prime,16)) } c.bitLength() > e && (c = s(e, t)); var h = c.toString(16); r.target.postMessage({ hex: h, workLoad: p }), c.dAddOffset(f, 0) } } l = Math.max(1, l); for (var a = [], n = 0; n < l; ++n) a[n] = new Worker(h); for (var o = l, n = 0; n < l; ++n) a[n].addEventListener("message", r); var d = !1 } if ("undefined" == typeof Worker) return r(e, t, n, i); var c = s(e, t) , l = n.workers , p = n.workLoad || 100 , f = 30 * p / 8 , h = n.workerScript || "forge/prime.worker.js"; if (-1 === l) return a.util.estimateCores(function(e, t) { e && (t = 2), l = t - 1, o() }); o() } function s(e, t) { var r = new u(e,t) , a = e - 1; return r.testBit(a) || r.bitwiseTo(u.ONE.shiftLeft(a), f, r), r.dAddOffset(31 - r.mod(p).byteValue(), 0), r } function o(e) { return e <= 100 ? 27 : e <= 150 ? 18 : e <= 200 ? 15 : e <= 250 ? 12 : e <= 300 ? 9 : e <= 350 ? 8 : e <= 400 ? 7 : e <= 500 ? 6 : e <= 600 ? 5 : e <= 800 ? 4 : e <= 1250 ? 3 : 2 } if (a.prime) return void (e.exports = a.prime); var c = e.exports = a.prime = a.prime || {} , u = a.jsbn.BigInteger , l = [6, 4, 2, 4, 2, 4, 6, 2] , p = new u(null); p.fromInt(30); var f = function(e, t) { return e | t }; c.generateProbablePrime = function(e, r, n) { "function" == typeof r && (n = r, r = {}), r = r || {}; var i = r.algorithm || "PRIMEINC"; "string" == typeof i && (i = { name: i }), i.options = i.options || {}; var s = r.prng || a.random , o = { nextBytes: function(e) { for (var t = s.getBytesSync(e.length), r = 0; r < e.length; ++r) e[r] = t.charCodeAt(r) } }; if ("PRIMEINC" === i.name) return t(e, o, i.options, n); throw new Error("Invalid prime generation algorithm: " + i.name) } }() } , function(e, t, r) { function a(e, t, r, a) { for (var n = [], i = 0; i < e.length; i++) for (var s = 0; s < e[i].safeBags.length; s++) { var o = e[i].safeBags[s]; void 0 !== a && o.type !== a || (null !== t ? void 0 !== o.attributes[t] && o.attributes[t].indexOf(r) >= 0 && n.push(o) : n.push(o)) } return n } function n(e) { if (e.composed || e.constructed) { for (var t = u.util.createBuffer(), r = 0; r < e.value.length; ++r) t.putBytes(e.value[r].value); e.composed = e.constructed = !1, e.value = t.getBytes() } return e } function i(e, t, r, a) { if (t = l.fromDer(t, r), t.tagClass !== l.Class.UNIVERSAL || t.type !== l.Type.SEQUENCE || !0 !== t.constructed) throw new Error("PKCS#12 AuthenticatedSafe expected to be a SEQUENCE OF ContentInfo"); for (var i = 0; i < t.value.length; i++) { var c = t.value[i] , u = {} , f = []; if (!l.validate(c, h, u, f)) { var d = new Error("Cannot read ContentInfo."); throw d.errors = f, d } var y = { encrypted: !1 } , g = null , v = u.content.value[0]; switch (l.derToOid(u.contentType)) { case p.oids.data: if (v.tagClass !== l.Class.UNIVERSAL || v.type !== l.Type.OCTETSTRING) throw new Error("PKCS#12 SafeContents Data is not an OCTET STRING."); g = n(v).value; break; case p.oids.encryptedData: g = s(v, a), y.encrypted = !0; break; default: var d = new Error("Unsupported PKCS#12 contentType."); throw d.contentType = l.derToOid(u.contentType), d } y.safeBags = o(g, r, a), e.safeContents.push(y) } } function s(e, t) { var r = {} , a = []; if (!l.validate(e, u.pkcs7.asn1.encryptedDataValidator, r, a)) { var i = new Error("Cannot read EncryptedContentInfo."); throw i.errors = a, i } var s = l.derToOid(r.contentType); if (s !== p.oids.data) { var i = new Error("PKCS#12 EncryptedContentInfo ContentType is not Data."); throw i.oid = s, i } s = l.derToOid(r.encAlgorithm); var o = p.pbe.getCipher(s, r.encParameter, t) , c = n(r.encryptedContentAsn1) , f = u.util.createBuffer(c.value); if (o.update(f), !o.finish()) throw new Error("Failed to decrypt PKCS#12 SafeContents."); return o.output.getBytes() } function o(e, t, r) { if (!t && 0 === e.length) return []; if (e = l.fromDer(e, t), e.tagClass !== l.Class.UNIVERSAL || e.type !== l.Type.SEQUENCE || !0 !== e.constructed) throw new Error("PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag."); for (var a = [], n = 0; n < e.value.length; n++) { var i = e.value[n] , s = {} , o = []; if (!l.validate(i, y, s, o)) { var u = new Error("Cannot read SafeBag."); throw u.errors = o, u } var f = { type: l.derToOid(s.bagId), attributes: c(s.bagAttributes) }; a.push(f); var h, d, g = s.bagValue.value[0]; switch (f.type) { case p.oids.pkcs8ShroudedKeyBag: if (null === (g = p.decryptPrivateKeyInfo(g, r))) throw new Error("Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?"); case p.oids.keyBag: try { f.key = p.privateKeyFromAsn1(g) } catch (e) { f.key = null, f.asn1 = g } continue; case p.oids.certBag: h = v, d = function() { if (l.derToOid(s.certId) !== p.oids.x509Certificate) { var e = new Error("Unsupported certificate type, only X.509 supported."); throw e.oid = l.derToOid(s.certId), e } var r = l.fromDer(s.cert, t); try { f.cert = p.certificateFromAsn1(r, !0) } catch (e) { f.cert = null, f.asn1 = r } } ; break; default: var u = new Error("Unsupported PKCS#12 SafeBag type."); throw u.oid = f.type, u } if (void 0 !== h && !l.validate(g, h, s, o)) { var u = new Error("Cannot read PKCS#12 " + h.name); throw u.errors = o, u } d() } return a } function c(e) { var t = {}; if (void 0 !== e) for (var r = 0; r < e.length; ++r) { var a = {} , n = []; if (!l.validate(e[r], g, a, n)) { var i = new Error("Cannot read PKCS#12 BagAttribute."); throw i.errors = n, i } var s = l.derToOid(a.oid); if (void 0 !== p.oids[s]) { t[p.oids[s]] = []; for (var o = 0; o < a.values.length; ++o) t[p.oids[s]].push(a.values[o].value) } } return t } var u = r(0); r(3), r(8), r(6), r(29), r(22), r(2), r(11), r(9), r(1), r(17); var l = u.asn1 , p = u.pki , f = e.exports = u.pkcs12 = u.pkcs12 || {} , h = { name: "ContentInfo", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "ContentInfo.contentType", tagClass: l.Class.UNIVERSAL, type: l.Type.OID, constructed: !1, capture: "contentType" }, { name: "ContentInfo.content", tagClass: l.Class.CONTEXT_SPECIFIC, constructed: !0, captureAsn1: "content" }] } , d = { name: "PFX", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "PFX.version", tagClass: l.Class.UNIVERSAL, type: l.Type.INTEGER, constructed: !1, capture: "version" }, h, { name: "PFX.macData", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, optional: !0, captureAsn1: "mac", value: [{ name: "PFX.macData.mac", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "PFX.macData.mac.digestAlgorithm", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "PFX.macData.mac.digestAlgorithm.algorithm", tagClass: l.Class.UNIVERSAL, type: l.Type.OID, constructed: !1, capture: "macAlgorithm" }, { name: "PFX.macData.mac.digestAlgorithm.parameters", tagClass: l.Class.UNIVERSAL, captureAsn1: "macAlgorithmParameters" }] }, { name: "PFX.macData.mac.digest", tagClass: l.Class.UNIVERSAL, type: l.Type.OCTETSTRING, constructed: !1, capture: "macDigest" }] }, { name: "PFX.macData.macSalt", tagClass: l.Class.UNIVERSAL, type: l.Type.OCTETSTRING, constructed: !1, capture: "macSalt" }, { name: "PFX.macData.iterations", tagClass: l.Class.UNIVERSAL, type: l.Type.INTEGER, constructed: !1, optional: !0, capture: "macIterations" }] }] } , y = { name: "SafeBag", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "SafeBag.bagId", tagClass: l.Class.UNIVERSAL, type: l.Type.OID, constructed: !1, capture: "bagId" }, { name: "SafeBag.bagValue", tagClass: l.Class.CONTEXT_SPECIFIC, constructed: !0, captureAsn1: "bagValue" }, { name: "SafeBag.bagAttributes", tagClass: l.Class.UNIVERSAL, type: l.Type.SET, constructed: !0, optional: !0, capture: "bagAttributes" }] } , g = { name: "Attribute", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "Attribute.attrId", tagClass: l.Class.UNIVERSAL, type: l.Type.OID, constructed: !1, capture: "oid" }, { name: "Attribute.attrValues", tagClass: l.Class.UNIVERSAL, type: l.Type.SET, constructed: !0, capture: "values" }] } , v = { name: "CertBag", tagClass: l.Class.UNIVERSAL, type: l.Type.SEQUENCE, constructed: !0, value: [{ name: "CertBag.certId", tagClass: l.Class.UNIVERSAL, type: l.Type.OID, constructed: !1, capture: "certId" }, { name: "CertBag.certValue", tagClass: l.Class.CONTEXT_SPECIFIC, constructed: !0, value: [{ name: "CertBag.certValue[0]", tagClass: l.Class.UNIVERSAL, type: l.Class.OCTETSTRING, constructed: !1, capture: "cert" }] }] }; f.pkcs12FromAsn1 = function(e, t, r) { "string" == typeof t ? (r = t, t = !0) : void 0 === t && (t = !0); var s = {} , o = []; if (!l.validate(e, d, s, o)) { var c = new Error("Cannot read PKCS#12 PFX. ASN.1 object is not an PKCS#12 PFX."); throw c.errors = c, c } var h = { version: s.version.charCodeAt(0), safeContents: [], getBags: function(e) { var t, r = {}; return "localKeyId"in e ? t = e.localKeyId : "localKeyIdHex"in e && (t = u.util.hexToBytes(e.localKeyIdHex)), void 0 === t && !("friendlyName"in e) && "bagType"in e && (r[e.bagType] = a(h.safeContents, null, null, e.bagType)), void 0 !== t && (r.localKeyId = a(h.safeContents, "localKeyId", t, e.bagType)), "friendlyName"in e && (r.friendlyName = a(h.safeContents, "friendlyName", e.friendlyName, e.bagType)), r }, getBagsByFriendlyName: function(e, t) { return a(h.safeContents, "friendlyName", e, t) }, getBagsByLocalKeyId: function(e, t) { return a(h.safeContents, "localKeyId", e, t) } }; if (3 !== s.version.charCodeAt(0)) { var c = new Error("PKCS#12 PFX of version other than 3 not supported."); throw c.version = s.version.charCodeAt(0), c } if (l.derToOid(s.contentType) !== p.oids.data) { var c = new Error("Only PKCS#12 PFX in password integrity mode supported."); throw c.oid = l.derToOid(s.contentType), c } var y = s.content.value[0]; if (y.tagClass !== l.Class.UNIVERSAL || y.type !== l.Type.OCTETSTRING) throw new Error("PKCS#12 authSafe content data is not an OCTET STRING."); if (y = n(y), s.mac) { var g = null , v = 0 , m = l.derToOid(s.macAlgorithm); switch (m) { case p.oids.sha1: g = u.md.sha1.create(), v = 20; break; case p.oids.sha256: g = u.md.sha256.create(), v = 32; break; case p.oids.sha384: g = u.md.sha384.create(), v = 48; break; case p.oids.sha512: g = u.md.sha512.create(), v = 64; break; case p.oids.md5: g = u.md.md5.create(), v = 16 } if (null === g) throw new Error("PKCS#12 uses unsupported MAC algorithm: " + m); var C = new u.util.ByteBuffer(s.macSalt) , E = "macIterations"in s ? parseInt(u.util.bytesToHex(s.macIterations), 16) : 1 , S = f.generateKey(r, C, 3, E, v, g) , T = u.hmac.create(); T.start(g, S), T.update(y.value); if (T.getMac().getBytes() !== s.macDigest) throw new Error("PKCS#12 MAC could not be verified. Invalid password?") } return i(h, y.value, t, r), h } , f.toPkcs12Asn1 = function(e, t, r, a) { a = a || {}, a.saltSize = a.saltSize || 8, a.count = a.count || 2048, a.algorithm = a.algorithm || a.encAlgorithm || "aes128", "useMac"in a || (a.useMac = !0), "localKeyId"in a || (a.localKeyId = null), "generateLocalKeyId"in a || (a.generateLocalKeyId = !0); var n, i = a.localKeyId; if (null !== i) i = u.util.hexToBytes(i); else if (a.generateLocalKeyId) if (t) { var s = u.util.isArray(t) ? t[0] : t; "string" == typeof s && (s = p.certificateFromPem(s)); var o = u.md.sha1.create(); o.update(l.toDer(p.certificateToAsn1(s)).getBytes()), i = o.digest().getBytes() } else i = u.random.getBytes(20); var c = []; null !== i && c.push(l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.localKeyId).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.SET, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, i)])])), "friendlyName"in a && c.push(l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.friendlyName).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.SET, !0, [l.create(l.Class.UNIVERSAL, l.Type.BMPSTRING, !1, a.friendlyName)])])), c.length > 0 && (n = l.create(l.Class.UNIVERSAL, l.Type.SET, !0, c)); var h = [] , d = []; null !== t && (d = u.util.isArray(t) ? t : [t]); for (var y = [], g = 0; g < d.length; ++g) { t = d[g], "string" == typeof t && (t = p.certificateFromPem(t)); var v = 0 === g ? n : void 0 , m = p.certificateToAsn1(t) , C = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.certBag).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.x509Certificate).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(m).getBytes())])])]), v]); y.push(C) } if (y.length > 0) { var E = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, y) , S = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.data).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(E).getBytes())])]); h.push(S) } var T = null; if (null !== e) { var I = p.wrapRsaPrivateKey(p.privateKeyToAsn1(e)); T = null === r ? l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.keyBag).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [I]), n]) : l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.pkcs8ShroudedKeyBag).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [p.encryptPrivateKeyInfo(I, r, a)]), n]); var b = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [T]) , A = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.data).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(b).getBytes())])]); h.push(A) } var B, N = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, h); if (a.useMac) { var o = u.md.sha1.create() , k = new u.util.ByteBuffer(u.random.getBytes(a.saltSize)) , w = a.count , e = f.generateKey(r, k, 3, w, 20) , R = u.hmac.create(); R.start(o, e), R.update(l.toDer(N).getBytes()); var _ = R.getMac(); B = l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.sha1).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.NULL, !1, "")]), l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, _.getBytes())]), l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, k.getBytes()), l.create(l.Class.UNIVERSAL, l.Type.INTEGER, !1, l.integerToDer(w).getBytes())]) } return l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.INTEGER, !1, l.integerToDer(3).getBytes()), l.create(l.Class.UNIVERSAL, l.Type.SEQUENCE, !0, [l.create(l.Class.UNIVERSAL, l.Type.OID, !1, l.oidToDer(p.oids.data).getBytes()), l.create(l.Class.CONTEXT_SPECIFIC, 0, !0, [l.create(l.Class.UNIVERSAL, l.Type.OCTETSTRING, !1, l.toDer(N).getBytes())])]), B]) } , f.generateKey = u.pbe.generatePkcs12Key } , function(e, t, r) { var a = r(0); r(3), r(1); var n = a.asn1 , i = e.exports = a.pkcs7asn1 = a.pkcs7asn1 || {}; a.pkcs7 = a.pkcs7 || {}, a.pkcs7.asn1 = i; var s = { name: "ContentInfo", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "ContentInfo.ContentType", tagClass: n.Class.UNIVERSAL, type: n.Type.OID, constructed: !1, capture: "contentType" }, { name: "ContentInfo.content", tagClass: n.Class.CONTEXT_SPECIFIC, type: 0, constructed: !0, optional: !0, captureAsn1: "content" }] }; i.contentInfoValidator = s; var o = { name: "EncryptedContentInfo", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "EncryptedContentInfo.contentType", tagClass: n.Class.UNIVERSAL, type: n.Type.OID, constructed: !1, capture: "contentType" }, { name: "EncryptedContentInfo.contentEncryptionAlgorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "EncryptedContentInfo.contentEncryptionAlgorithm.algorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.OID, constructed: !1, capture: "encAlgorithm" }, { name: "EncryptedContentInfo.contentEncryptionAlgorithm.parameter", tagClass: n.Class.UNIVERSAL, captureAsn1: "encParameter" }] }, { name: "EncryptedContentInfo.encryptedContent", tagClass: n.Class.CONTEXT_SPECIFIC, type: 0, capture: "encryptedContent", captureAsn1: "encryptedContentAsn1" }] }; i.envelopedDataValidator = { name: "EnvelopedData", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "EnvelopedData.Version", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1, capture: "version" }, { name: "EnvelopedData.RecipientInfos", tagClass: n.Class.UNIVERSAL, type: n.Type.SET, constructed: !0, captureAsn1: "recipientInfos" }].concat(o) }, i.encryptedDataValidator = { name: "EncryptedData", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "EncryptedData.Version", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1, capture: "version" }].concat(o) }; var c = { name: "SignerInfo", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "SignerInfo.version", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1 }, { name: "SignerInfo.issuerAndSerialNumber", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "SignerInfo.issuerAndSerialNumber.issuer", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, captureAsn1: "issuer" }, { name: "SignerInfo.issuerAndSerialNumber.serialNumber", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1, capture: "serial" }] }, { name: "SignerInfo.digestAlgorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "SignerInfo.digestAlgorithm.algorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.OID, constructed: !1, capture: "digestAlgorithm" }, { name: "SignerInfo.digestAlgorithm.parameter", tagClass: n.Class.UNIVERSAL, constructed: !1, captureAsn1: "digestParameter", optional: !0 }] }, { name: "SignerInfo.authenticatedAttributes", tagClass: n.Class.CONTEXT_SPECIFIC, type: 0, constructed: !0, optional: !0, capture: "authenticatedAttributes" }, { name: "SignerInfo.digestEncryptionAlgorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, capture: "signatureAlgorithm" }, { name: "SignerInfo.encryptedDigest", tagClass: n.Class.UNIVERSAL, type: n.Type.OCTETSTRING, constructed: !1, capture: "signature" }, { name: "SignerInfo.unauthenticatedAttributes", tagClass: n.Class.CONTEXT_SPECIFIC, type: 1, constructed: !0, optional: !0, capture: "unauthenticatedAttributes" }] }; i.signedDataValidator = { name: "SignedData", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "SignedData.Version", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1, capture: "version" }, { name: "SignedData.DigestAlgorithms", tagClass: n.Class.UNIVERSAL, type: n.Type.SET, constructed: !0, captureAsn1: "digestAlgorithms" }, s, { name: "SignedData.Certificates", tagClass: n.Class.CONTEXT_SPECIFIC, type: 0, optional: !0, captureAsn1: "certificates" }, { name: "SignedData.CertificateRevocationLists", tagClass: n.Class.CONTEXT_SPECIFIC, type: 1, optional: !0, captureAsn1: "crls" }, { name: "SignedData.SignerInfos", tagClass: n.Class.UNIVERSAL, type: n.Type.SET, capture: "signerInfos", optional: !0, value: [c] }] }, i.recipientInfoValidator = { name: "RecipientInfo", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "RecipientInfo.version", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1, capture: "version" }, { name: "RecipientInfo.issuerAndSerial", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "RecipientInfo.issuerAndSerial.issuer", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, captureAsn1: "issuer" }, { name: "RecipientInfo.issuerAndSerial.serialNumber", tagClass: n.Class.UNIVERSAL, type: n.Type.INTEGER, constructed: !1, capture: "serial" }] }, { name: "RecipientInfo.keyEncryptionAlgorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.SEQUENCE, constructed: !0, value: [{ name: "RecipientInfo.keyEncryptionAlgorithm.algorithm", tagClass: n.Class.UNIVERSAL, type: n.Type.OID, constructed: !1, capture: "encAlgorithm" }, { name: "RecipientInfo.keyEncryptionAlgorithm.parameter", tagClass: n.Class.UNIVERSAL, constructed: !1, captureAsn1: "encParameter" }] }, { name: "RecipientInfo.encryptedKey", tagClass: n.Class.UNIVERSAL, type: n.Type.OCTETSTRING, constructed: !1, capture: "encKey" }] } } , function(e, t, r) { var a = r(0); r(1), a.mgf = a.mgf || {}, (e.exports = a.mgf.mgf1 = a.mgf1 = a.mgf1 || {}).create = function(e) { return { generate: function(t, r) { for (var n = new a.util.ByteBuffer, i = Math.ceil(r / e.digestLength), s = 0; s < i; s++) { var o = new a.util.ByteBuffer; o.putInt32(s), e.start(), e.update(t + o.getBytes()), n.putBuffer(e.digest()) } return n.truncate(n.length() - r), n.getBytes() } } } } , function(e, t, r) { var a = r(0); e.exports = a.debug = a.debug || {}, a.debug.storage = {}, a.debug.get = function(e, t) { var r; return void 0 === e ? r = a.debug.storage : e in a.debug.storage && (r = void 0 === t ? a.debug.storage[e] : a.debug.storage[e][t]), r } , a.debug.set = function(e, t, r) { e in a.debug.storage || (a.debug.storage[e] = {}), a.debug.storage[e][t] = r } , a.debug.clear = function(e, t) { void 0 === e ? a.debug.storage = {} : e in a.debug.storage && (void 0 === t ? delete a.debug.storage[e] : delete a.debug.storage[e][t]) } } , function(e, t, r) { function a() { c = String.fromCharCode(128), c += i.util.fillString(String.fromCharCode(0), 128), l = [[1116352408, 3609767458], [1899447441, 602891725], [3049323471, 3964484399], [3921009573, 2173295548], [961987163, 4081628472], [1508970993, 3053834265], [2453635748, 2937671579], [2870763221, 3664609560], [3624381080, 2734883394], [310598401, 1164996542], [607225278, 1323610764], [1426881987, 3590304994], [1925078388, 4068182383], [2162078206, 991336113], [2614888103, 633803317], [3248222580, 3479774868], [3835390401, 2666613458], [4022224774, 944711139], [264347078, 2341262773], [604807628, 2007800933], [770255983, 1495990901], [1249150122, 1856431235], [1555081692, 3175218132], [1996064986, 2198950837], [2554220882, 3999719339], [2821834349, 766784016], [2952996808, 2566594879], [3210313671, 3203337956], [3336571891, 1034457026], [3584528711, 2466948901], [113926993, 3758326383], [338241895, 168717936], [666307205, 1188179964], [773529912, 1546045734], [1294757372, 1522805485], [1396182291, 2643833823], [1695183700, 2343527390], [1986661051, 1014477480], [2177026350, 1206759142], [2456956037, 344077627], [2730485921, 1290863460], [2820302411, 3158454273], [3259730800, 3505952657], [3345764771, 106217008], [3516065817, 3606008344], [3600352804, 1432725776], [4094571909, 1467031594], [275423344, 851169720], [430227734, 3100823752], [506948616, 1363258195], [659060556, 3750685593], [883997877, 3785050280], [958139571, 3318307427], [1322822218, 3812723403], [1537002063, 2003034995], [1747873779, 3602036899], [1955562222, 1575990012], [2024104815, 1125592928], [2227730452, 2716904306], [2361852424, 442776044], [2428436474, 593698344], [2756734187, 3733110249], [3204031479, 2999351573], [3329325298, 3815920427], [3391569614, 3928383900], [3515267271, 566280711], [3940187606, 3454069534], [4118630271, 4000239992], [116418474, 1914138554], [174292421, 2731055270], [289380356, 3203993006], [460393269, 320620315], [685471733, 587496836], [852142971, 1086792851], [1017036298, 365543100], [1126000580, 2618297676], [1288033470, 3409855158], [1501505948, 4234509866], [1607167915, 987167468], [1816402316, 1246189591]], p = {}, p["SHA-512"] = [[1779033703, 4089235720], [3144134277, 2227873595], [1013904242, 4271175723], [2773480762, 1595750129], [1359893119, 2917565137], [2600822924, 725511199], [528734635, 4215389547], [1541459225, 327033209]], p["SHA-384"] = [[3418070365, 3238371032], [1654270250, 914150663], [2438529370, 812702999], [355462360, 4144912697], [1731405415, 4290775857], [2394180231, 1750603025], [3675008525, 1694076839], [1203062813, 3204075428]], p["SHA-512/256"] = [[573645204, 4230739756], [2673172387, 3360449730], [596883563, 1867755857], [2520282905, 1497426621], [2519219938, 2827943907], [3193839141, 1401305490], [721525244, 746961066], [246885852, 2177182882]], p["SHA-512/224"] = [[2352822216, 424955298], [1944164710, 2312950998], [502970286, 855612546], [1738396948, 1479516111], [258812777, 2077511080], [2011393907, 79989058], [1067287976, 1780299464], [286451373, 2446758561]], u = !0 } function n(e, t, r) { for (var a, n, i, s, o, c, u, p, f, h, d, y, g, v, m, C, E, S, T, I, b, A, B, N, k, w, R, _, L, U, D, P, V, O, K, x = r.length(); x >= 128; ) { for (L = 0; L < 16; ++L) t[L][0] = r.getInt32() >>> 0, t[L][1] = r.getInt32() >>> 0; for (; L < 80; ++L) P = t[L - 2], U = P[0], D = P[1], a = ((U >>> 19 | D << 13) ^ (D >>> 29 | U << 3) ^ U >>> 6) >>> 0, n = ((U << 13 | D >>> 19) ^ (D << 3 | U >>> 29) ^ (U << 26 | D >>> 6)) >>> 0, O = t[L - 15], U = O[0], D = O[1], i = ((U >>> 1 | D << 31) ^ (U >>> 8 | D << 24) ^ U >>> 7) >>> 0, s = ((U << 31 | D >>> 1) ^ (U << 24 | D >>> 8) ^ (U << 25 | D >>> 7)) >>> 0, V = t[L - 7], K = t[L - 16], D = n + V[1] + s + K[1], t[L][0] = a + V[0] + i + K[0] + (D / 4294967296 >>> 0) >>> 0, t[L][1] = D >>> 0; for (g = e[0][0], v = e[0][1], m = e[1][0], C = e[1][1], E = e[2][0], S = e[2][1], T = e[3][0], I = e[3][1], b = e[4][0], A = e[4][1], B = e[5][0], N = e[5][1], k = e[6][0], w = e[6][1], R = e[7][0], _ = e[7][1], L = 0; L < 80; ++L) u = ((b >>> 14 | A << 18) ^ (b >>> 18 | A << 14) ^ (A >>> 9 | b << 23)) >>> 0, p = ((b << 18 | A >>> 14) ^ (b << 14 | A >>> 18) ^ (A << 23 | b >>> 9)) >>> 0, f = (k ^ b & (B ^ k)) >>> 0, h = (w ^ A & (N ^ w)) >>> 0, o = ((g >>> 28 | v << 4) ^ (v >>> 2 | g << 30) ^ (v >>> 7 | g << 25)) >>> 0, c = ((g << 4 | v >>> 28) ^ (v << 30 | g >>> 2) ^ (v << 25 | g >>> 7)) >>> 0, d = (g & m | E & (g ^ m)) >>> 0, y = (v & C | S & (v ^ C)) >>> 0, D = _ + p + h + l[L][1] + t[L][1], a = R + u + f + l[L][0] + t[L][0] + (D / 4294967296 >>> 0) >>> 0, n = D >>> 0, D = c + y, i = o + d + (D / 4294967296 >>> 0) >>> 0, s = D >>> 0, R = k, _ = w, k = B, w = N, B = b, N = A, D = I + n, b = T + a + (D / 4294967296 >>> 0) >>> 0, A = D >>> 0, T = E, I = S, E = m, S = C, m = g, C = v, D = n + s, g = a + i + (D / 4294967296 >>> 0) >>> 0, v = D >>> 0; D = e[0][1] + v, e[0][0] = e[0][0] + g + (D / 4294967296 >>> 0) >>> 0, e[0][1] = D >>> 0, D = e[1][1] + C, e[1][0] = e[1][0] + m + (D / 4294967296 >>> 0) >>> 0, e[1][1] = D >>> 0, D = e[2][1] + S, e[2][0] = e[2][0] + E + (D / 4294967296 >>> 0) >>> 0, e[2][1] = D >>> 0, D = e[3][1] + I, e[3][0] = e[3][0] + T + (D / 4294967296 >>> 0) >>> 0, e[3][1] = D >>> 0, D = e[4][1] + A, e[4][0] = e[4][0] + b + (D / 4294967296 >>> 0) >>> 0, e[4][1] = D >>> 0, D = e[5][1] + N, e[5][0] = e[5][0] + B + (D / 4294967296 >>> 0) >>> 0, e[5][1] = D >>> 0, D = e[6][1] + w, e[6][0] = e[6][0] + k + (D / 4294967296 >>> 0) >>> 0, e[6][1] = D >>> 0, D = e[7][1] + _, e[7][0] = e[7][0] + R + (D / 4294967296 >>> 0) >>> 0, e[7][1] = D >>> 0, x -= 128 } } var i = r(0); r(4), r(1); var s = e.exports = i.sha512 = i.sha512 || {}; i.md.sha512 = i.md.algorithms.sha512 = s; var o = i.sha384 = i.sha512.sha384 = i.sha512.sha384 || {}; o.create = function() { return s.create("SHA-384") } , i.md.sha384 = i.md.algorithms.sha384 = o, i.sha512.sha256 = i.sha512.sha256 || { create: function() { return s.create("SHA-512/256") } }, i.md["sha512/256"] = i.md.algorithms["sha512/256"] = i.sha512.sha256, i.sha512.sha224 = i.sha512.sha224 || { create: function() { return s.create("SHA-512/224") } }, i.md["sha512/224"] = i.md.algorithms["sha512/224"] = i.sha512.sha224, s.create = function(e) { if (u || a(), void 0 === e && (e = "SHA-512"), !(e in p)) throw new Error("Invalid SHA-512 algorithm: " + e); for (var t = p[e], r = null, s = i.util.createBuffer(), o = new Array(80), l = 0; l < 80; ++l) o[l] = new Array(2); var f = 64; switch (e) { case "SHA-384": f = 48; break; case "SHA-512/256": f = 32; break; case "SHA-512/224": f = 28 } var h = { algorithm: e.replace("-", "").toLowerCase(), blockLength: 128, digestLength: f, messageLength: 0, fullMessageLength: null, messageLengthSize: 16 }; return h.start = function() { h.messageLength = 0, h.fullMessageLength = h.messageLength128 = []; for (var e = h.messageLengthSize / 4, a = 0; a < e; ++a) h.fullMessageLength.push(0); s = i.util.createBuffer(), r = new Array(t.length); for (var a = 0; a < t.length; ++a) r[a] = t[a].slice(0); return h } , h.start(), h.update = function(e, t) { "utf8" === t && (e = i.util.encodeUtf8(e)); var a = e.length; h.messageLength += a, a = [a / 4294967296 >>> 0, a >>> 0]; for (var c = h.fullMessageLength.length - 1; c >= 0; --c) h.fullMessageLength[c] += a[1], a[1] = a[0] + (h.fullMessageLength[c] / 4294967296 >>> 0), h.fullMessageLength[c] = h.fullMessageLength[c] >>> 0, a[0] = a[1] / 4294967296 >>> 0; return s.putBytes(e), n(r, o, s), (s.read > 2048 || 0 === s.length()) && s.compact(), h } , h.digest = function() { var t = i.util.createBuffer(); t.putBytes(s.bytes()); var a = h.fullMessageLength[h.fullMessageLength.length - 1] + h.messageLengthSize , u = a & h.blockLength - 1; t.putBytes(c.substr(0, h.blockLength - u)); for (var l, p, f = 8 * h.fullMessageLength[0], d = 0; d < h.fullMessageLength.length - 1; ++d) l = 8 * h.fullMessageLength[d + 1], p = l / 4294967296 >>> 0, f += p, t.putInt32(f >>> 0), f = l >>> 0; t.putInt32(f); for (var y = new Array(r.length), d = 0; d < r.length; ++d) y[d] = r[d].slice(0); n(y, o, t); var g, v = i.util.createBuffer(); g = "SHA-512" === e ? y.length : "SHA-384" === e ? y.length - 2 : y.length - 4; for (var d = 0; d < g; ++d) v.putInt32(y[d][0]), d === g - 1 && "SHA-512/224" === e || v.putInt32(y[d][1]); return v } , h } ; var c = null , u = !1 , l = null , p = null } , function(e, t, r) { var a = r(0); r(1), e.exports = a.log = a.log || {}, a.log.levels = ["none", "error", "warning", "info", "debug", "verbose", "max"]; var n = {} , i = [] , s = null; a.log.LEVEL_LOCKED = 2, a.log.NO_LEVEL_CHECK = 4, a.log.INTERPOLATE = 8; for (var o = 0; o < a.log.levels.length; ++o) { var c = a.log.levels[o]; n[c] = { index: o, name: c.toUpperCase() } } a.log.logMessage = function(e) { for (var t = n[e.level].index, r = 0; r < i.length; ++r) { var s = i[r]; if (s.flags & a.log.NO_LEVEL_CHECK) s.f(e); else { t <= n[s.level].index && s.f(s, e) } } } , a.log.prepareStandard = function(e) { "standard"in e || (e.standard = n[e.level].name + " [" + e.category + "] " + e.message) } , a.log.prepareFull = function(e) { if (!("full"in e)) { var t = [e.message]; t = t.concat([] || e.arguments), e.full = a.util.format.apply(this, t) } } , a.log.prepareStandardFull = function(e) { "standardFull"in e || (a.log.prepareStandard(e), e.standardFull = e.standard) } ; for (var u = ["error", "warning", "info", "debug", "verbose"], o = 0; o < u.length; ++o) !function(e) { a.log[e] = function(t, r) { var n = Array.prototype.slice.call(arguments).slice(2) , i = { timestamp: new Date, level: e, category: t, message: r, arguments: n }; a.log.logMessage(i) } }(u[o]); if (a.log.makeLogger = function(e) { var t = { flags: 0, f: e }; return a.log.setLevel(t, "none"), t } , a.log.setLevel = function(e, t) { var r = !1; if (e && !(e.flags & a.log.LEVEL_LOCKED)) for (var n = 0; n < a.log.levels.length; ++n) { var i = a.log.levels[n]; if (t == i) { e.level = t, r = !0; break } } return r } , a.log.lock = function(e, t) { void 0 === t || t ? e.flags |= a.log.LEVEL_LOCKED : e.flags &= ~a.log.LEVEL_LOCKED } , a.log.addLogger = function(e) { i.push(e) } , "undefined" != typeof console && "log"in console) { var l; if (console.error && console.warn && console.info && console.debug) { var p = { error: console.error, warning: console.warn, info: console.info, debug: console.debug, verbose: console.debug } , f = function(e, t) { a.log.prepareStandard(t); var r = p[t.level] , n = [t.standard]; n = n.concat(t.arguments.slice()), r.apply(console, n) }; l = a.log.makeLogger(f) } else { var f = function(e, t) { a.log.prepareStandardFull(t), console.log(t.standardFull) }; l = a.log.makeLogger(f) } a.log.setLevel(l, "debug"), a.log.addLogger(l), s = l } else console = { log: function() {} }; if (null !== s) { var h = a.util.getQueryVariables(); if ("console.level"in h && a.log.setLevel(s, h["console.level"].slice(-1)[0]), "console.lock"in h) { "true" == h["console.lock"].slice(-1)[0] && a.log.lock(s) } } a.log.consoleLogger = s } , function(e, t, r) { e.exports = r(35) } , function(e, t, r) { e.exports = r(0), r(5), r(38), r(3), r(13), r(31), r(10), r(40), r(8), r(41), r(33), r(42), r(30), r(15), r(7), r(26), r(28), r(43), r(21), r(27), r(24), r(18), r(2), r(25), r(44), r(45), r(20), r(1) } , function(e, t) { var r; r = function() { return this }(); try { r = r || Function("return this")() || (0, eval)("this") } catch (e) { "object" == typeof window && (r = window) } e.exports = r } , function(e, t) { function r(e, t) { var r = 0 , a = t.length , n = t.charAt(0) , i = [0]; for (r = 0; r < e.length(); ++r) { for (var s = 0, o = e.at(r); s < i.length; ++s) o += i[s] << 8, i[s] = o % a, o = o / a | 0; for (; o > 0; ) i.push(o % a), o = o / a | 0 } var c = ""; for (r = 0; 0 === e.at(r) && r < e.length() - 1; ++r) c += n; for (r = i.length - 1; r >= 0; --r) c += t[i[r]]; return c } var a = {}; e.exports = a; var n = {}; a.encode = function(e, t, a) { if ("string" != typeof t) throw new TypeError('"alphabet" must be a string.'); if (void 0 !== a && "number" != typeof a) throw new TypeError('"maxline" must be a number.'); var n = ""; if (e instanceof Uint8Array) { var i = 0 , s = t.length , o = t.charAt(0) , c = [0]; for (i = 0; i < e.length; ++i) { for (var u = 0, l = e[i]; u < c.length; ++u) l += c[u] << 8, c[u] = l % s, l = l / s | 0; for (; l > 0; ) c.push(l % s), l = l / s | 0 } for (i = 0; 0 === e[i] && i < e.length - 1; ++i) n += o; for (i = c.length - 1; i >= 0; --i) n += t[c[i]] } else n = r(e, t); if (a) { var p = new RegExp(".{1," + a + "}","g"); n = n.match(p).join("\r\n") } return n } , a.decode = function(e, t) { if ("string" != typeof e) throw new TypeError('"input" must be a string.'); if ("string" != typeof t) throw new TypeError('"alphabet" must be a string.'); var r = n[t]; if (!r) { r = n[t] = []; for (var a = 0; a < t.length; ++a) r[t.charCodeAt(a)] = a } e = e.replace(/\s/g, ""); for (var i = t.length, s = t.charAt(0), o = [0], a = 0; a < e.length; a++) { var c = r[e.charCodeAt(a)]; if (void 0 === c) return; for (var u = 0, l = c; u < o.length; ++u) l += o[u] * i, o[u] = 255 & l, l >>= 8; for (; l > 0; ) o.push(255 & l), l >>= 8 } for (var p = 0; e[p] === s && p < e.length - 1; ++p) o.push(0); return "undefined" != typeof Buffer ? Buffer.from(o.reverse()) : new Uint8Array(o.reverse()) } } , function(e, t, r) { function a(e, t, r) { var a = t.entity === u.tls.ConnectionEnd.client; e.read.cipherState = { init: !1, cipher: u.cipher.createDecipher("AES-CBC", a ? r.keys.server_write_key : r.keys.client_write_key), iv: a ? r.keys.server_write_IV : r.keys.client_write_IV }, e.write.cipherState = { init: !1, cipher: u.cipher.createCipher("AES-CBC", a ? r.keys.client_write_key : r.keys.server_write_key), iv: a ? r.keys.client_write_IV : r.keys.server_write_IV }, e.read.cipherFunction = o, e.write.cipherFunction = n, e.read.macLength = e.write.macLength = r.mac_length, e.read.macFunction = e.write.macFunction = l.hmac_sha1 } function n(e, t) { var r = !1 , a = t.macFunction(t.macKey, t.sequenceNumber, e); e.fragment.putBytes(a), t.updateSequenceNumber(); var n; n = e.version.minor === l.Versions.TLS_1_0.minor ? t.cipherState.init ? null : t.cipherState.iv : u.random.getBytesSync(16), t.cipherState.init = !0; var s = t.cipherState.cipher; return s.start({ iv: n }), e.version.minor >= l.Versions.TLS_1_1.minor && s.output.putBytes(n), s.update(e.fragment), s.finish(i) && (e.fragment = s.output, e.length = e.fragment.length(), r = !0), r } function i(e, t, r) { if (!r) { var a = e - t.length() % e; t.fillWithByte(a - 1, a) } return !0 } function s(e, t, r) { var a = !0; if (r) { for (var n = t.length(), i = t.last(), s = n - 1 - i; s < n - 1; ++s) a = a && t.at(s) == i; a && t.truncate(i + 1) } return a } function o(e, t) { var r, a = !1; r = e.version.minor === l.Versions.TLS_1_0.minor ? t.cipherState.init ? null : t.cipherState.iv : e.fragment.getBytes(16), t.cipherState.init = !0; var n = t.cipherState.cipher; n.start({ iv: r }), n.update(e.fragment), a = n.finish(s); var i = t.macLength , o = u.random.getBytesSync(i) , p = n.output.length(); p >= i ? (e.fragment = n.output.getBytes(p - i), o = n.output.getBytes(i)) : e.fragment = n.output.getBytes(), e.fragment = u.util.createBuffer(e.fragment), e.length = e.fragment.length(); var f = t.macFunction(t.macKey, t.sequenceNumber, e); return t.updateSequenceNumber(), a = c(t.macKey, o, f) && a } function c(e, t, r) { var a = u.hmac.create(); return a.start("SHA1", e), a.update(t), t = a.digest().getBytes(), a.start(null, null), a.update(r), r = a.digest().getBytes(), t === r } var u = r(0); r(5), r(20); var l = e.exports = u.tls; l.CipherSuites.TLS_RSA_WITH_AES_128_CBC_SHA = { id: [0, 47], name: "TLS_RSA_WITH_AES_128_CBC_SHA", initSecurityParameters: function(e) { e.bulk_cipher_algorithm = l.BulkCipherAlgorithm.aes, e.cipher_type = l.CipherType.block, e.enc_key_length = 16, e.block_length = 16, e.fixed_iv_length = 16, e.record_iv_length = 16, e.mac_algorithm = l.MACAlgorithm.hmac_sha1, e.mac_length = 20, e.mac_key_length = 20 }, initConnectionState: a }, l.CipherSuites.TLS_RSA_WITH_AES_256_CBC_SHA = { id: [0, 53], name: "TLS_RSA_WITH_AES_256_CBC_SHA", initSecurityParameters: function(e) { e.bulk_cipher_algorithm = l.BulkCipherAlgorithm.aes, e.cipher_type = l.CipherType.block, e.enc_key_length = 32, e.block_length = 16, e.fixed_iv_length = 16, e.record_iv_length = 16, e.mac_algorithm = l.MACAlgorithm.hmac_sha1, e.mac_length = 20, e.mac_key_length = 20 }, initConnectionState: a } } , function(e, t, r) { var a = r(0); r(30), e.exports = a.mgf = a.mgf || {}, a.mgf.mgf1 = a.mgf1 } , function(e, t, r) { function a(e) { var t = e.message; if (t instanceof Uint8Array) return t; var r = e.encoding; if (void 0 === t) { if (!e.md) throw new TypeError('"options.message" or "options.md" not specified.'); t = e.md.digest().getBytes(), r = "binary" } if ("string" == typeof t && !r) throw new TypeError('"options.encoding" must be "binary" or "utf8".'); if ("string" == typeof t) { if ("undefined" != typeof Buffer) return new Buffer(t,r); t = new D(t,r) } else if (!(t instanceof D)) throw new TypeError('"options.message" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a string with "options.encoding" specifying its encoding.'); for (var a = new P(t.length()), n = 0; n < a.length; ++n) a[n] = t.at(n); return a } function n(e, t) { var r = L.md.sha512.create() , a = new D(e); r.update(a.getBytes(t), "binary"); var n = r.digest().getBytes(); if ("undefined" != typeof Buffer) return new Buffer(n,"binary"); for (var i = new P(V.constants.HASH_BYTE_LENGTH), s = 0; s < 64; ++s) i[s] = n.charCodeAt(s); return i } function i(e, t) { var r, a = [N(), N(), N(), N()], i = n(t, 32); for (i[0] &= 248, i[31] &= 127, i[31] |= 64, T(a, i), f(e, a), r = 0; r < 32; ++r) t[r + 32] = e[r]; return 0 } function s(e, t, r, a) { var i, s, o = new Float64Array(64), l = [N(), N(), N(), N()], p = n(a, 32); p[0] &= 248, p[31] &= 127, p[31] |= 64; var h = r + 64; for (i = 0; i < r; ++i) e[64 + i] = t[i]; for (i = 0; i < 32; ++i) e[32 + i] = p[32 + i]; var d = n(e.subarray(32), r + 32); for (u(d), T(l, d), f(e, l), i = 32; i < 64; ++i) e[i] = a[i]; var y = n(e, r + 64); for (u(y), i = 32; i < 64; ++i) o[i] = 0; for (i = 0; i < 32; ++i) o[i] = d[i]; for (i = 0; i < 32; ++i) for (s = 0; s < 32; s++) o[i + s] += y[i] * p[s]; return c(e.subarray(32), o), h } function o(e, t, r, a) { var i, s = new P(32), o = [N(), N(), N(), N()], c = [N(), N(), N(), N()]; if (-1, r < 64) return -1; if (d(c, a)) return -1; for (i = 0; i < r; ++i) e[i] = t[i]; for (i = 0; i < 32; ++i) e[i + 32] = a[i]; var p = n(e, r); if (u(p), S(o, c, p), T(c, t.subarray(32)), l(o, c), f(s, o), r -= 64, m(t, 0, s, 0)) { for (i = 0; i < r; ++i) e[i] = 0; return -1 } for (i = 0; i < r; ++i) e[i] = t[i + 64]; return r } function c(e, t) { var r, a, n, i; for (a = 63; a >= 32; --a) { for (r = 0, n = a - 32, i = a - 12; n < i; ++n) t[n] += r - 16 * t[a] * j[n - (a - 32)], r = t[n] + 128 >> 8, t[n] -= 256 * r; t[n] += r, t[a] = 0 } for (r = 0, n = 0; n < 32; ++n) t[n] += r - (t[31] >> 4) * j[n], r = t[n] >> 8, t[n] &= 255; for (n = 0; n < 32; ++n) t[n] -= r * j[n]; for (a = 0; a < 32; ++a) t[a + 1] += t[a] >> 8, e[a] = 255 & t[a] } function u(e) { for (var t = new Float64Array(64), r = 0; r < 64; ++r) t[r] = e[r], e[r] = 0; c(e, t) } function l(e, t) { var r = N() , a = N() , n = N() , i = N() , s = N() , o = N() , c = N() , u = N() , l = N(); w(r, e[1], e[0]), w(l, t[1], t[0]), _(r, r, l), k(a, e[0], e[1]), k(l, t[0], t[1]), _(a, a, l), _(n, e[3], t[3]), _(n, n, M), _(i, e[2], t[2]), k(i, i, i), w(s, a, r), w(o, i, n), k(c, i, n), k(u, a, r), _(e[0], s, o), _(e[1], u, c), _(e[2], c, o), _(e[3], s, u) } function p(e, t, r) { for (var a = 0; a < 4; ++a) B(e[a], t[a], r) } function f(e, t) { var r = N() , a = N() , n = N(); b(n, t[2]), _(r, t[0], n), _(a, t[1], n), h(e, a), e[31] ^= E(r) << 7 } function h(e, t) { var r, a, n, i = N(), s = N(); for (r = 0; r < 16; ++r) s[r] = t[r]; for (A(s), A(s), A(s), a = 0; a < 2; ++a) { for (i[0] = s[0] - 65517, r = 1; r < 15; ++r) i[r] = s[r] - 65535 - (i[r - 1] >> 16 & 1), i[r - 1] &= 65535; i[15] = s[15] - 32767 - (i[14] >> 16 & 1), n = i[15] >> 16 & 1, i[14] &= 65535, B(s, i, 1 - n) } for (r = 0; r < 16; r++) e[2 * r] = 255 & s[r], e[2 * r + 1] = s[r] >> 8 } function d(e, t) { var r = N() , a = N() , n = N() , i = N() , s = N() , o = N() , c = N(); return I(e[2], K), y(e[1], t), R(n, e[1]), _(i, n, x), w(n, n, e[2]), k(i, e[2], i), R(s, i), R(o, s), _(c, o, s), _(r, c, n), _(r, r, i), g(r, r), _(r, r, n), _(r, r, i), _(r, r, i), _(e[0], r, i), R(a, e[0]), _(a, a, i), v(a, n) && _(e[0], e[0], G), R(a, e[0]), _(a, a, i), v(a, n) ? -1 : (E(e[0]) === t[31] >> 7 && w(e[0], O, e[0]), _(e[3], e[0], e[1]), 0) } function y(e, t) { var r; for (r = 0; r < 16; ++r) e[r] = t[2 * r] + (t[2 * r + 1] << 8); e[15] &= 32767 } function g(e, t) { var r, a = N(); for (r = 0; r < 16; ++r) a[r] = t[r]; for (r = 250; r >= 0; --r) R(a, a), 1 !== r && _(a, a, t); for (r = 0; r < 16; ++r) e[r] = a[r] } function v(e, t) { var r = new P(32) , a = new P(32); return h(r, e), h(a, t), m(r, 0, a, 0) } function m(e, t, r, a) { return C(e, t, r, a, 32) } function C(e, t, r, a, n) { var i, s = 0; for (i = 0; i < n; ++i) s |= e[t + i] ^ r[a + i]; return (1 & s - 1 >>> 8) - 1 } function E(e) { var t = new P(32); return h(t, e), 1 & t[0] } function S(e, t, r) { var a, n; for (I(e[0], O), I(e[1], K), I(e[2], K), I(e[3], O), n = 255; n >= 0; --n) a = r[n / 8 | 0] >> (7 & n) & 1, p(e, t, a), l(t, e), l(e, e), p(e, t, a) } function T(e, t) { var r = [N(), N(), N(), N()]; I(r[0], F), I(r[1], q), I(r[2], K), _(r[3], F, q), S(e, r, t) } function I(e, t) { var r; for (r = 0; r < 16; r++) e[r] = 0 | t[r] } function b(e, t) { var r, a = N(); for (r = 0; r < 16; ++r) a[r] = t[r]; for (r = 253; r >= 0; --r) R(a, a), 2 !== r && 4 !== r && _(a, a, t); for (r = 0; r < 16; ++r) e[r] = a[r] } function A(e) { var t, r, a = 1; for (t = 0; t < 16; ++t) r = e[t] + a + 65535, a = Math.floor(r / 65536), e[t] = r - 65536 * a; e[0] += a - 1 + 37 * (a - 1) } function B(e, t, r) { for (var a, n = ~(r - 1), i = 0; i < 16; ++i) a = n & (e[i] ^ t[i]), e[i] ^= a, t[i] ^= a } function N(e) { var t, r = new Float64Array(16); if (e) for (t = 0; t < e.length; ++t) r[t] = e[t]; return r } function k(e, t, r) { for (var a = 0; a < 16; ++a) e[a] = t[a] + r[a] } function w(e, t, r) { for (var a = 0; a < 16; ++a) e[a] = t[a] - r[a] } function R(e, t) { _(e, t, t) } function _(e, t, r) { var a, n, i = 0, s = 0, o = 0, c = 0, u = 0, l = 0, p = 0, f = 0, h = 0, d = 0, y = 0, g = 0, v = 0, m = 0, C = 0, E = 0, S = 0, T = 0, I = 0, b = 0, A = 0, B = 0, N = 0, k = 0, w = 0, R = 0, _ = 0, L = 0, U = 0, D = 0, P = 0, V = r[0], O = r[1], K = r[2], x = r[3], M = r[4], F = r[5], q = r[6], j = r[7], G = r[8], H = r[9], Q = r[10], z = r[11], W = r[12], Y = r[13], X = r[14], Z = r[15]; a = t[0], i += a * V, s += a * O, o += a * K, c += a * x, u += a * M, l += a * F, p += a * q, f += a * j, h += a * G, d += a * H, y += a * Q, g += a * z, v += a * W, m += a * Y, C += a * X, E += a * Z, a = t[1], s += a * V, o += a * O, c += a * K, u += a * x, l += a * M, p += a * F, f += a * q, h += a * j, d += a * G, y += a * H, g += a * Q, v += a * z, m += a * W, C += a * Y, E += a * X, S += a * Z, a = t[2], o += a * V, c += a * O, u += a * K, l += a * x, p += a * M, f += a * F, h += a * q, d += a * j, y += a * G, g += a * H, v += a * Q, m += a * z, C += a * W, E += a * Y, S += a * X, T += a * Z, a = t[3], c += a * V, u += a * O, l += a * K, p += a * x, f += a * M, h += a * F, d += a * q, y += a * j, g += a * G, v += a * H, m += a * Q, C += a * z, E += a * W, S += a * Y, T += a * X, I += a * Z, a = t[4], u += a * V, l += a * O, p += a * K, f += a * x, h += a * M, d += a * F, y += a * q, g += a * j, v += a * G, m += a * H, C += a * Q, E += a * z, S += a * W, T += a * Y, I += a * X, b += a * Z, a = t[5], l += a * V, p += a * O, f += a * K, h += a * x, d += a * M, y += a * F, g += a * q, v += a * j, m += a * G, C += a * H, E += a * Q, S += a * z, T += a * W, I += a * Y, b += a * X, A += a * Z, a = t[6], p += a * V, f += a * O, h += a * K, d += a * x, y += a * M, g += a * F, v += a * q, m += a * j, C += a * G, E += a * H, S += a * Q, T += a * z, I += a * W, b += a * Y, A += a * X, B += a * Z, a = t[7], f += a * V, h += a * O, d += a * K, y += a * x, g += a * M, v += a * F, m += a * q, C += a * j, E += a * G, S += a * H, T += a * Q, I += a * z, b += a * W, A += a * Y, B += a * X, N += a * Z, a = t[8], h += a * V, d += a * O, y += a * K, g += a * x, v += a * M, m += a * F, C += a * q, E += a * j, S += a * G, T += a * H, I += a * Q, b += a * z, A += a * W, B += a * Y, N += a * X, k += a * Z, a = t[9], d += a * V, y += a * O, g += a * K, v += a * x, m += a * M, C += a * F, E += a * q, S += a * j, T += a * G, I += a * H, b += a * Q, A += a * z, B += a * W, N += a * Y, k += a * X, w += a * Z, a = t[10], y += a * V, g += a * O, v += a * K, m += a * x, C += a * M, E += a * F, S += a * q, T += a * j, I += a * G, b += a * H, A += a * Q, B += a * z, N += a * W, k += a * Y, w += a * X, R += a * Z, a = t[11], g += a * V, v += a * O, m += a * K, C += a * x, E += a * M, S += a * F, T += a * q, I += a * j, b += a * G, A += a * H, B += a * Q, N += a * z; k += a * W, w += a * Y, R += a * X, _ += a * Z, a = t[12], v += a * V, m += a * O, C += a * K, E += a * x, S += a * M, T += a * F, I += a * q, b += a * j, A += a * G, B += a * H, N += a * Q, k += a * z, w += a * W, R += a * Y, _ += a * X, L += a * Z, a = t[13], m += a * V, C += a * O, E += a * K, S += a * x, T += a * M, I += a * F, b += a * q, A += a * j, B += a * G, N += a * H, k += a * Q, w += a * z, R += a * W, _ += a * Y, L += a * X, U += a * Z, a = t[14], C += a * V, E += a * O, S += a * K, T += a * x, I += a * M, b += a * F, A += a * q, B += a * j, N += a * G, k += a * H, w += a * Q, R += a * z, _ += a * W, L += a * Y, U += a * X, D += a * Z, a = t[15], E += a * V, S += a * O, T += a * K, I += a * x, b += a * M, A += a * F, B += a * q, N += a * j, k += a * G, w += a * H, R += a * Q, _ += a * z, L += a * W, U += a * Y, D += a * X, P += a * Z, i += 38 * S, s += 38 * T, o += 38 * I, c += 38 * b, u += 38 * A, l += 38 * B, p += 38 * N, f += 38 * k, h += 38 * w, d += 38 * R, y += 38 * _, g += 38 * L, v += 38 * U, m += 38 * D, C += 38 * P, n = 1, a = i + n + 65535, n = Math.floor(a / 65536), i = a - 65536 * n, a = s + n + 65535, n = Math.floor(a / 65536), s = a - 65536 * n, a = o + n + 65535, n = Math.floor(a / 65536), o = a - 65536 * n, a = c + n + 65535, n = Math.floor(a / 65536), c = a - 65536 * n, a = u + n + 65535, n = Math.floor(a / 65536), u = a - 65536 * n, a = l + n + 65535, n = Math.floor(a / 65536), l = a - 65536 * n, a = p + n + 65535, n = Math.floor(a / 65536), p = a - 65536 * n, a = f + n + 65535, n = Math.floor(a / 65536), f = a - 65536 * n, a = h + n + 65535, n = Math.floor(a / 65536), h = a - 65536 * n, a = d + n + 65535, n = Math.floor(a / 65536), d = a - 65536 * n, a = y + n + 65535, n = Math.floor(a / 65536), y = a - 65536 * n, a = g + n + 65535, n = Math.floor(a / 65536), g = a - 65536 * n, a = v + n + 65535, n = Math.floor(a / 65536), v = a - 65536 * n, a = m + n + 65535, n = Math.floor(a / 65536), m = a - 65536 * n, a = C + n + 65535, n = Math.floor(a / 65536), C = a - 65536 * n, a = E + n + 65535, n = Math.floor(a / 65536), E = a - 65536 * n, i += n - 1 + 37 * (n - 1), n = 1, a = i + n + 65535, n = Math.floor(a / 65536), i = a - 65536 * n, a = s + n + 65535, n = Math.floor(a / 65536), s = a - 65536 * n, a = o + n + 65535, n = Math.floor(a / 65536), o = a - 65536 * n, a = c + n + 65535, n = Math.floor(a / 65536), c = a - 65536 * n, a = u + n + 65535, n = Math.floor(a / 65536), u = a - 65536 * n, a = l + n + 65535, n = Math.floor(a / 65536), l = a - 65536 * n, a = p + n + 65535, n = Math.floor(a / 65536), p = a - 65536 * n, a = f + n + 65535, n = Math.floor(a / 65536), f = a - 65536 * n, a = h + n + 65535, n = Math.floor(a / 65536), h = a - 65536 * n, a = d + n + 65535, n = Math.floor(a / 65536), d = a - 65536 * n, a = y + n + 65535, n = Math.floor(a / 65536), y = a - 65536 * n, a = g + n + 65535, n = Math.floor(a / 65536), g = a - 65536 * n, a = v + n + 65535, n = Math.floor(a / 65536), v = a - 65536 * n, a = m + n + 65535, n = Math.floor(a / 65536), m = a - 65536 * n, a = C + n + 65535, n = Math.floor(a / 65536), C = a - 65536 * n, a = E + n + 65535, n = Math.floor(a / 65536), E = a - 65536 * n, i += n - 1 + 37 * (n - 1), e[0] = i, e[1] = s, e[2] = o, e[3] = c, e[4] = u, e[5] = l, e[6] = p, e[7] = f, e[8] = h, e[9] = d, e[10] = y, e[11] = g, e[12] = v; e[13] = m, e[14] = C, e[15] = E } var L = r(0); if (r(12), r(2), r(32), r(1), void 0 === U) var U = L.jsbn.BigInteger; var D = L.util.ByteBuffer , P = "undefined" == typeof Buffer ? Uint8Array : Buffer; L.pki = L.pki || {}, e.exports = L.pki.ed25519 = L.ed25519 = L.ed25519 || {}; var V = L.ed25519; V.constants = {}, V.constants.PUBLIC_KEY_BYTE_LENGTH = 32, V.constants.PRIVATE_KEY_BYTE_LENGTH = 64, V.constants.SEED_BYTE_LENGTH = 32, V.constants.SIGN_BYTE_LENGTH = 64, V.constants.HASH_BYTE_LENGTH = 64, V.generateKeyPair = function(e) { e = e || {}; var t = e.seed; if (void 0 === t) t = L.random.getBytesSync(V.constants.SEED_BYTE_LENGTH); else if ("string" == typeof t) { if (t.length !== V.constants.SEED_BYTE_LENGTH) throw new TypeError('"seed" must be ' + V.constants.SEED_BYTE_LENGTH + " bytes in length.") } else if (!(t instanceof Uint8Array)) throw new TypeError('"seed" must be a node.js Buffer, Uint8Array, or a binary string.'); t = a({ message: t, encoding: "binary" }); for (var r = new P(V.constants.PUBLIC_KEY_BYTE_LENGTH), n = new P(V.constants.PRIVATE_KEY_BYTE_LENGTH), s = 0; s < 32; ++s) n[s] = t[s]; return i(r, n), { publicKey: r, privateKey: n } } , V.publicKeyFromPrivateKey = function(e) { e = e || {}; var t = a({ message: e.privateKey, encoding: "binary" }); if (t.length !== V.constants.PRIVATE_KEY_BYTE_LENGTH) throw new TypeError('"options.privateKey" must have a byte length of ' + V.constants.PRIVATE_KEY_BYTE_LENGTH); for (var r = new P(V.constants.PUBLIC_KEY_BYTE_LENGTH), n = 0; n < r.length; ++n) r[n] = t[32 + n]; return r } , V.sign = function(e) { e = e || {}; var t = a(e) , r = a({ message: e.privateKey, encoding: "binary" }); if (r.length !== V.constants.PRIVATE_KEY_BYTE_LENGTH) throw new TypeError('"options.privateKey" must have a byte length of ' + V.constants.PRIVATE_KEY_BYTE_LENGTH); var n = new P(V.constants.SIGN_BYTE_LENGTH + t.length); s(n, t, t.length, r); for (var i = new P(V.constants.SIGN_BYTE_LENGTH), o = 0; o < i.length; ++o) i[o] = n[o]; return i } , V.verify = function(e) { e = e || {}; var t = a(e); if (void 0 === e.signature) throw new TypeError('"options.signature" must be a node.js Buffer, a Uint8Array, a forge ByteBuffer, or a binary string.'); var r = a({ message: e.signature, encoding: "binary" }); if (r.length !== V.constants.SIGN_BYTE_LENGTH) throw new TypeError('"options.signature" must have a byte length of ' + V.constants.SIGN_BYTE_LENGTH); var n = a({ message: e.publicKey, encoding: "binary" }); if (n.length !== V.constants.PUBLIC_KEY_BYTE_LENGTH) throw new TypeError('"options.publicKey" must have a byte length of ' + V.constants.PUBLIC_KEY_BYTE_LENGTH); var i, s = new P(V.constants.SIGN_BYTE_LENGTH + t.length), c = new P(V.constants.SIGN_BYTE_LENGTH + t.length); for (i = 0; i < V.constants.SIGN_BYTE_LENGTH; ++i) s[i] = r[i]; for (i = 0; i < t.length; ++i) s[i + V.constants.SIGN_BYTE_LENGTH] = t[i]; return o(c, s, s.length, n) >= 0 } ; var O = N() , K = N([1]) , x = N([30883, 4953, 19914, 30187, 55467, 16705, 2637, 112, 59544, 30585, 16505, 36039, 65139, 11119, 27886, 20995]) , M = N([61785, 9906, 39828, 60374, 45398, 33411, 5274, 224, 53552, 61171, 33010, 6542, 64743, 22239, 55772, 9222]) , F = N([54554, 36645, 11616, 51542, 42930, 38181, 51040, 26924, 56412, 64982, 57905, 49316, 21502, 52590, 14035, 8553]) , q = N([26200, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214, 26214]) , j = new Float64Array([237, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16]) , G = N([41136, 18958, 6951, 50414, 58488, 44335, 6150, 12099, 55207, 15867, 153, 11085, 57099, 20417, 9344, 11139]) } , function(e, t, r) { function a(e, t, r, a) { e.generate = function(e, i) { for (var s = new n.util.ByteBuffer, o = Math.ceil(i / a) + r, c = new n.util.ByteBuffer, u = r; u < o; ++u) { c.putInt32(u), t.start(), t.update(e + c.getBytes()); var l = t.digest(); s.putBytes(l.getBytes(a)) } return s.truncate(s.length() - i), s.getBytes() } } var n = r(0); r(1), r(2), r(12), e.exports = n.kem = n.kem || {}; var i = n.jsbn.BigInteger; n.kem.rsa = {}, n.kem.rsa.create = function(e, t) { t = t || {}; var r = t.prng || n.random , a = {}; return a.encrypt = function(t, a) { var s, o = Math.ceil(t.n.bitLength() / 8); do { s = new i(n.util.bytesToHex(r.getBytesSync(o)),16).mod(t.n) } while (s.compareTo(i.ONE) <= 0); s = n.util.hexToBytes(s.toString(16)); var c = o - s.length; return c > 0 && (s = n.util.fillString(String.fromCharCode(0), c) + s), { encapsulation: t.encrypt(s, "NONE"), key: e.generate(s, a) } } , a.decrypt = function(t, r, a) { var n = t.decrypt(r, "NONE"); return e.generate(n, a) } , a } , n.kem.kdf1 = function(e, t) { a(this, e, 0, t || e.digestLength) } , n.kem.kdf2 = function(e, t) { a(this, e, 1, t || e.digestLength) } } , function(e, t, r) { e.exports = r(4), r(14), r(9), r(23), r(32) } , function(e, t, r) { function a(e) { var t = {} , r = []; if (!d.validate(e, y.asn1.recipientInfoValidator, t, r)) { var a = new Error("Cannot read PKCS#7 RecipientInfo. ASN.1 object is not an PKCS#7 RecipientInfo."); throw a.errors = r, a } return { version: t.version.charCodeAt(0), issuer: h.pki.RDNAttributesAsArray(t.issuer), serialNumber: h.util.createBuffer(t.serial).toHex(), encryptedContent: { algorithm: d.derToOid(t.encAlgorithm), parameter: t.encParameter.value, content: t.encKey } } } function n(e) { return d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(e.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [h.pki.distinguishedNameToAsn1({ attributes: e.issuer }), d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, h.util.hexToBytes(e.serialNumber))]), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.encryptedContent.algorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")]), d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.encryptedContent.content)]) } function i(e) { for (var t = [], r = 0; r < e.length; ++r) t.push(a(e[r])); return t } function s(e) { for (var t = [], r = 0; r < e.length; ++r) t.push(n(e[r])); return t } function o(e) { var t = d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(e.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [h.pki.distinguishedNameToAsn1({ attributes: e.issuer }), d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, h.util.hexToBytes(e.serialNumber))]), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.digestAlgorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")])]); if (e.authenticatedAttributesAsn1 && t.value.push(e.authenticatedAttributesAsn1), t.value.push(d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.signatureAlgorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")])), t.value.push(d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.signature)), e.unauthenticatedAttributes.length > 0) { for (var r = d.create(d.Class.CONTEXT_SPECIFIC, 1, !0, []), a = 0; a < e.unauthenticatedAttributes.length; ++a) { var n = e.unauthenticatedAttributes[a]; r.values.push(u(n)) } t.value.push(r) } return t } function c(e) { for (var t = [], r = 0; r < e.length; ++r) t.push(o(e[r])); return t } function u(e) { var t; if (e.type === h.pki.oids.contentType) t = d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.value).getBytes()); else if (e.type === h.pki.oids.messageDigest) t = d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.value.bytes()); else if (e.type === h.pki.oids.signingTime) { var r = new Date("1950-01-01T00:00:00Z") , a = new Date("2050-01-01T00:00:00Z") , n = e.value; if ("string" == typeof n) { var i = Date.parse(n); n = isNaN(i) ? 13 === n.length ? d.utcTimeToDate(n) : d.generalizedTimeToDate(n) : new Date(i) } t = n >= r && n < a ? d.create(d.Class.UNIVERSAL, d.Type.UTCTIME, !1, d.dateToUtcTime(n)) : d.create(d.Class.UNIVERSAL, d.Type.GENERALIZEDTIME, !1, d.dateToGeneralizedTime(n)) } return d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.type).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SET, !0, [t])]) } function l(e) { return [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(h.pki.oids.data).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.algorithm).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.parameter.getBytes())]), d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, e.content.getBytes())])] } function p(e, t, r) { var a = {} , n = []; if (!d.validate(t, r, a, n)) { var i = new Error("Cannot read PKCS#7 message. ASN.1 object is not a supported PKCS#7 message."); throw i.errors = i, i } if (d.derToOid(a.contentType) !== h.pki.oids.data) throw new Error("Unsupported PKCS#7 message. Only wrapped ContentType Data supported."); if (a.encryptedContent) { var s = ""; if (h.util.isArray(a.encryptedContent)) for (var o = 0; o < a.encryptedContent.length; ++o) { if (a.encryptedContent[o].type !== d.Type.OCTETSTRING) throw new Error("Malformed PKCS#7 message, expecting encrypted content constructed of only OCTET STRING objects."); s += a.encryptedContent[o].value } else s = a.encryptedContent; e.encryptedContent = { algorithm: d.derToOid(a.encAlgorithm), parameter: h.util.createBuffer(a.encParameter.value), content: h.util.createBuffer(s) } } if (a.content) { var s = ""; if (h.util.isArray(a.content)) for (var o = 0; o < a.content.length; ++o) { if (a.content[o].type !== d.Type.OCTETSTRING) throw new Error("Malformed PKCS#7 message, expecting content constructed of only OCTET STRING objects."); s += a.content[o].value } else s = a.content; e.content = h.util.createBuffer(s) } return e.version = a.version.charCodeAt(0), e.rawCapture = a, a } function f(e) { if (void 0 === e.encryptedContent.key) throw new Error("Symmetric key not available."); if (void 0 === e.content) { var t; switch (e.encryptedContent.algorithm) { case h.pki.oids["aes128-CBC"]: case h.pki.oids["aes192-CBC"]: case h.pki.oids["aes256-CBC"]: t = h.aes.createDecryptionCipher(e.encryptedContent.key); break; case h.pki.oids.desCBC: case h.pki.oids["des-EDE3-CBC"]: t = h.des.createDecryptionCipher(e.encryptedContent.key); break; default: throw new Error("Unsupported symmetric cipher, OID " + e.encryptedContent.algorithm) } if (t.start(e.encryptedContent.parameter), t.update(e.encryptedContent.content), !t.finish()) throw new Error("Symmetric decryption failed."); e.content = t.output } } var h = r(0); r(5), r(3), r(10), r(6), r(7), r(29), r(2), r(1), r(17); var d = h.asn1 , y = e.exports = h.pkcs7 = h.pkcs7 || {}; y.messageFromPem = function(e) { var t = h.pem.decode(e)[0]; if ("PKCS7" !== t.type) { var r = new Error('Could not convert PKCS#7 message from PEM; PEM header type is not "PKCS#7".'); throw r.headerType = t.type, r } if (t.procType && "ENCRYPTED" === t.procType.type) throw new Error("Could not convert PKCS#7 message from PEM; PEM is encrypted."); var a = d.fromDer(t.body); return y.messageFromAsn1(a) } , y.messageToPem = function(e, t) { var r = { type: "PKCS7", body: d.toDer(e.toAsn1()).getBytes() }; return h.pem.encode(r, { maxline: t }) } , y.messageFromAsn1 = function(e) { var t = {} , r = []; if (!d.validate(e, y.asn1.contentInfoValidator, t, r)) { var a = new Error("Cannot read PKCS#7 message. ASN.1 object is not an PKCS#7 ContentInfo."); throw a.errors = r, a } var n, i = d.derToOid(t.contentType); switch (i) { case h.pki.oids.envelopedData: n = y.createEnvelopedData(); break; case h.pki.oids.encryptedData: n = y.createEncryptedData(); break; case h.pki.oids.signedData: n = y.createSignedData(); break; default: throw new Error("Cannot read PKCS#7 message. ContentType with OID " + i + " is not (yet) supported.") } return n.fromAsn1(t.content.value[0]), n } , y.createSignedData = function() { function e() { for (var e = {}, t = 0; t < r.signers.length; ++t) { var a = r.signers[t] , n = a.digestAlgorithm; n in e || (e[n] = h.md[h.pki.oids[n]].create()), 0 === a.authenticatedAttributes.length ? a.md = e[n] : a.md = h.md[h.pki.oids[n]].create() } r.digestAlgorithmIdentifiers = []; for (var n in e) r.digestAlgorithmIdentifiers.push(d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(n).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.NULL, !1, "")])); return e } function t(e) { var t; if (r.detachedContent ? t = r.detachedContent : (t = r.contentInfo.value[1], t = t.value[0]), !t) throw new Error("Could not sign PKCS#7 message; there is no content to sign."); var a = d.derToOid(r.contentInfo.value[0].value) , n = d.toDer(t); n.getByte(), d.getBerValueLength(n), n = n.getBytes(); for (var i in e) e[i].start().update(n); for (var s = new Date, o = 0; o < r.signers.length; ++o) { var l = r.signers[o]; if (0 === l.authenticatedAttributes.length) { if (a !== h.pki.oids.data) throw new Error("Invalid signer; authenticatedAttributes must be present when the ContentInfo content type is not PKCS#7 Data.") } else { l.authenticatedAttributesAsn1 = d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, []); for (var p = d.create(d.Class.UNIVERSAL, d.Type.SET, !0, []), f = 0; f < l.authenticatedAttributes.length; ++f) { var y = l.authenticatedAttributes[f]; y.type === h.pki.oids.messageDigest ? y.value = e[l.digestAlgorithm].digest() : y.type === h.pki.oids.signingTime && (y.value || (y.value = s)), p.value.push(u(y)), l.authenticatedAttributesAsn1.value.push(u(y)) } n = d.toDer(p).getBytes(), l.md.start().update(n) } l.signature = l.key.sign(l.md, "RSASSA-PKCS1-V1_5") } r.signerInfos = c(r.signers) } var r = null; return r = { type: h.pki.oids.signedData, version: 1, certificates: [], crls: [], signers: [], digestAlgorithmIdentifiers: [], contentInfo: null, signerInfos: [], fromAsn1: function(e) { if (p(r, e, y.asn1.signedDataValidator), r.certificates = [], r.crls = [], r.digestAlgorithmIdentifiers = [], r.contentInfo = null, r.signerInfos = [], r.rawCapture.certificates) for (var t = r.rawCapture.certificates.value, a = 0; a < t.length; ++a) r.certificates.push(h.pki.certificateFromAsn1(t[a])) }, toAsn1: function() { r.contentInfo || r.sign(); for (var e = [], t = 0; t < r.certificates.length; ++t) e.push(h.pki.certificateToAsn1(r.certificates[t])); var a = [] , n = d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(r.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SET, !0, r.digestAlgorithmIdentifiers), r.contentInfo])]); return e.length > 0 && n.value[0].value.push(d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, e)), a.length > 0 && n.value[0].value.push(d.create(d.Class.CONTEXT_SPECIFIC, 1, !0, a)), n.value[0].value.push(d.create(d.Class.UNIVERSAL, d.Type.SET, !0, r.signerInfos)), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(r.type).getBytes()), n]) }, addSigner: function(e) { var t = e.issuer , a = e.serialNumber; if (e.certificate) { var n = e.certificate; "string" == typeof n && (n = h.pki.certificateFromPem(n)), t = n.issuer.attributes, a = n.serialNumber } var i = e.key; if (!i) throw new Error("Could not add PKCS#7 signer; no private key specified."); "string" == typeof i && (i = h.pki.privateKeyFromPem(i)); var s = e.digestAlgorithm || h.pki.oids.sha1; switch (s) { case h.pki.oids.sha1: case h.pki.oids.sha256: case h.pki.oids.sha384: case h.pki.oids.sha512: case h.pki.oids.md5: break; default: throw new Error("Could not add PKCS#7 signer; unknown message digest algorithm: " + s) } var o = e.authenticatedAttributes || []; if (o.length > 0) { for (var c = !1, u = !1, l = 0; l < o.length; ++l) { var p = o[l]; if (c || p.type !== h.pki.oids.contentType) { if (u || p.type !== h.pki.oids.messageDigest) ; else if (u = !0, c) break } else if (c = !0, u) break } if (!c || !u) throw new Error("Invalid signer.authenticatedAttributes. If signer.authenticatedAttributes is specified, then it must contain at least two attributes, PKCS #9 content-type and PKCS #9 message-digest.") } r.signers.push({ key: i, version: 1, issuer: t, serialNumber: a, digestAlgorithm: s, signatureAlgorithm: h.pki.oids.rsaEncryption, signature: null, authenticatedAttributes: o, unauthenticatedAttributes: [] }) }, sign: function(a) { if (a = a || {}, ("object" != typeof r.content || null === r.contentInfo) && (r.contentInfo = d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(h.pki.oids.data).getBytes())]), "content"in r)) { var n; r.content instanceof h.util.ByteBuffer ? n = r.content.bytes() : "string" == typeof r.content && (n = h.util.encodeUtf8(r.content)), a.detached ? r.detachedContent = d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, n) : r.contentInfo.value.push(d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.OCTETSTRING, !1, n)])) } if (0 !== r.signers.length) { t(e()) } }, verify: function() { throw new Error("PKCS#7 signature verification not yet implemented.") }, addCertificate: function(e) { "string" == typeof e && (e = h.pki.certificateFromPem(e)), r.certificates.push(e) }, addCertificateRevokationList: function(e) { throw new Error("PKCS#7 CRL support not yet implemented.") } } } , y.createEncryptedData = function() { var e = null; return e = { type: h.pki.oids.encryptedData, version: 0, encryptedContent: { algorithm: h.pki.oids["aes256-CBC"] }, fromAsn1: function(t) { p(e, t, y.asn1.encryptedDataValidator) }, decrypt: function(t) { void 0 !== t && (e.encryptedContent.key = t), f(e) } } } , y.createEnvelopedData = function() { var e = null; return e = { type: h.pki.oids.envelopedData, version: 0, recipients: [], encryptedContent: { algorithm: h.pki.oids["aes256-CBC"] }, fromAsn1: function(t) { var r = p(e, t, y.asn1.envelopedDataValidator); e.recipients = i(r.recipientInfos.value) }, toAsn1: function() { return d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.OID, !1, d.oidToDer(e.type).getBytes()), d.create(d.Class.CONTEXT_SPECIFIC, 0, !0, [d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, [d.create(d.Class.UNIVERSAL, d.Type.INTEGER, !1, d.integerToDer(e.version).getBytes()), d.create(d.Class.UNIVERSAL, d.Type.SET, !0, s(e.recipients)), d.create(d.Class.UNIVERSAL, d.Type.SEQUENCE, !0, l(e.encryptedContent))])])]) }, findRecipient: function(t) { for (var r = t.issuer.attributes, a = 0; a < e.recipients.length; ++a) { var n = e.recipients[a] , i = n.issuer; if (n.serialNumber === t.serialNumber && i.length === r.length) { for (var s = !0, o = 0; o < r.length; ++o) if (i[o].type !== r[o].type || i[o].value !== r[o].value) { s = !1; break } if (s) return n } } return null }, decrypt: function(t, r) { if (void 0 === e.encryptedContent.key && void 0 !== t && void 0 !== r) switch (t.encryptedContent.algorithm) { case h.pki.oids.rsaEncryption: case h.pki.oids.desCBC: var a = r.decrypt(t.encryptedContent.content); e.encryptedContent.key = h.util.createBuffer(a); break; default: throw new Error("Unsupported asymmetric cipher, OID " + t.encryptedContent.algorithm) } f(e) }, addRecipient: function(t) { e.recipients.push({ version: 0, issuer: t.issuer.attributes, serialNumber: t.serialNumber, encryptedContent: { algorithm: h.pki.oids.rsaEncryption, key: t.publicKey } }) }, encrypt: function(t, r) { if (void 0 === e.encryptedContent.content) { r = r || e.encryptedContent.algorithm, t = t || e.encryptedContent.key; var a, n, i; switch (r) { case h.pki.oids["aes128-CBC"]: a = 16, n = 16, i = h.aes.createEncryptionCipher; break; case h.pki.oids["aes192-CBC"]: a = 24, n = 16, i = h.aes.createEncryptionCipher; break; case h.pki.oids["aes256-CBC"]: a = 32, n = 16, i = h.aes.createEncryptionCipher; break; case h.pki.oids["des-EDE3-CBC"]: a = 24, n = 8, i = h.des.createEncryptionCipher; break; default: throw new Error("Unsupported symmetric cipher, OID " + r) } if (void 0 === t) t = h.util.createBuffer(h.random.getBytes(a)); else if (t.length() != a) throw new Error("Symmetric key has wrong length; got " + t.length() + " bytes, expected " + a + "."); e.encryptedContent.algorithm = r, e.encryptedContent.key = t, e.encryptedContent.parameter = h.util.createBuffer(h.random.getBytes(n)); var s = i(t); if (s.start(e.encryptedContent.parameter.copy()), s.update(e.content), !s.finish()) throw new Error("Symmetric encryption failed."); e.encryptedContent.content = s.output } for (var o = 0; o < e.recipients.length; ++o) { var c = e.recipients[o]; if (void 0 === c.encryptedContent.content) switch (c.encryptedContent.algorithm) { case h.pki.oids.rsaEncryption: c.encryptedContent.content = c.encryptedContent.key.encrypt(e.encryptedContent.key.data); break; default: throw new Error("Unsupported asymmetric cipher, OID " + c.encryptedContent.algorithm) } } } } } } , function(e, t, r) { function a(e, t) { var r = t.toString(16); r[0] >= "8" && (r = "00" + r); var a = s.util.hexToBytes(r); e.putInt32(a.length), e.putBytes(a) } function n(e, t) { e.putInt32(t.length), e.putString(t) } function i() { for (var e = s.md.sha1.create(), t = arguments.length, r = 0; r < t; ++r) e.update(arguments[r]); return e.digest() } var s = r(0); r(5), r(8), r(14), r(9), r(1); var o = e.exports = s.ssh = s.ssh || {}; o.privateKeyToPutty = function(e, t, r) { r = r || "", t = t || ""; var o = "" === t ? "none" : "aes256-cbc" , c = "PuTTY-User-Key-File-2: ssh-rsa\r\n"; c += "Encryption: " + o + "\r\n", c += "Comment: " + r + "\r\n"; var u = s.util.createBuffer(); n(u, "ssh-rsa"), a(u, e.e), a(u, e.n); var l = s.util.encode64(u.bytes(), 64) , p = Math.floor(l.length / 66) + 1; c += "Public-Lines: " + p + "\r\n", c += l; var f = s.util.createBuffer(); a(f, e.d), a(f, e.p), a(f, e.q), a(f, e.qInv); var h; if (t) { var d = f.length() + 16 - 1; d -= d % 16; var y = i(f.bytes()); y.truncate(y.length() - d + f.length()), f.putBuffer(y); var g = s.util.createBuffer(); g.putBuffer(i("\0\0\0\0", t)), g.putBuffer(i("\0\0\0", t)); var v = s.aes.createEncryptionCipher(g.truncate(8), "CBC"); v.start(s.util.createBuffer().fillWithByte(0, 16)), v.update(f.copy()), v.finish(); var m = v.output; m.truncate(16), h = s.util.encode64(m.bytes(), 64) } else h = s.util.encode64(f.bytes(), 64); p = Math.floor(h.length / 66) + 1, c += "\r\nPrivate-Lines: " + p + "\r\n", c += h; var C = i("putty-private-key-file-mac-key", t) , E = s.util.createBuffer(); n(E, "ssh-rsa"), n(E, o), n(E, r), E.putInt32(u.length()), E.putBuffer(u), E.putInt32(f.length()), E.putBuffer(f); var S = s.hmac.create(); return S.start("sha1", C), S.update(E.bytes()), c += "\r\nPrivate-MAC: " + S.digest().toHex() + "\r\n" } , o.publicKeyToOpenSSH = function(e, t) { t = t || ""; var r = s.util.createBuffer(); return n(r, "ssh-rsa"), a(r, e.e), a(r, e.n), "ssh-rsa " + s.util.encode64(r.bytes()) + " " + t } , o.privateKeyToOpenSSH = function(e, t) { return t ? s.pki.encryptRsaPrivateKey(e, t, { legacy: !0, algorithm: "aes128" }) : s.pki.privateKeyToPem(e) } , o.getPublicKeyFingerprint = function(e, t) { t = t || {}; var r = t.md || s.md.md5.create() , i = s.util.createBuffer(); n(i, "ssh-rsa"), a(i, e.e), a(i, e.n), r.start(), r.update(i.getBytes()); var o = r.digest(); if ("hex" === t.encoding) { var c = o.toHex(); return t.delimiter ? c.match(/.{2}/g).join(t.delimiter) : c } if ("binary" === t.encoding) return o.getBytes(); if (t.encoding) throw new Error('Unknown encoding "' + t.encoding + '".'); return o } } , function(e, t, r) { var a = r(0); r(31), r(33), r(1); var n = "forge.task" , i = {} , s = 0; a.debug.set(n, "tasks", i); var o = {}; a.debug.set(n, "queues", o); var c = "ready" , u = "running" , l = "blocked" , p = "sleeping" , f = "done" , h = "error" , d = "stop" , y = "start" , g = {}; g[c] = {}, g[c][d] = c, g[c][y] = u, g[c].cancel = f, g[c].fail = h, g[u] = {}, g[u][d] = c, g[u][y] = u, g[u].block = l, g[u].unblock = u, g[u].sleep = p, g[u].wakeup = u, g[u].cancel = f, g[u].fail = h, g[l] = {}, g[l][d] = l, g[l][y] = l, g[l].block = l, g[l].unblock = l, g[l].sleep = l, g[l].wakeup = l, g[l].cancel = f, g[l].fail = h, g[p] = {}, g[p][d] = p, g[p][y] = p, g[p].block = p, g[p].unblock = p, g[p].sleep = p, g[p].wakeup = p, g[p].cancel = f, g[p].fail = h, g[f] = {}, g[f][d] = f, g[f][y] = f, g[f].block = f, g[f].unblock = f, g[f].sleep = f, g[f].wakeup = f, g[f].cancel = f, g[f].fail = h, g[h] = {}, g[h][d] = h, g[h][y] = h, g[h].block = h, g[h].unblock = h, g[h].sleep = h, g[h].wakeup = h, g[h].cancel = h, g[h].fail = h; var v = function(e) { this.id = -1, this.name = e.name || "?", this.parent = e.parent || null, this.run = e.run, this.subtasks = [], this.error = !1, this.state = c, this.blocks = 0, this.timeoutId = null, this.swapTime = null, this.userData = null, this.id = s++, i[this.id] = this }; v.prototype.debug = function(e) { e = e || "", a.log.debug(n, e, "[%s][%s] task:", this.id, this.name, this, "subtasks:", this.subtasks.length, "queue:", o) } , v.prototype.next = function(e, t) { "function" == typeof e && (t = e, e = this.name); var r = new v({ run: t, name: e, parent: this }); return r.state = u, r.type = this.type, r.successCallback = this.successCallback || null, r.failureCallback = this.failureCallback || null, this.subtasks.push(r), this } , v.prototype.parallel = function(e, t) { return a.util.isArray(e) && (t = e, e = this.name), this.next(e, function(r) { var n = r; n.block(t.length); for (var i = 0; i < t.length; i++) { var s = e + "__parallel-" + r.id + "-" + i , o = i; !function(e, r) { a.task.start({ type: e, run: function(e) { t[r](e) }, success: function(e) { n.unblock() }, failure: function(e) { n.unblock() } }) }(s, o) } }) } , v.prototype.stop = function() { this.state = g[this.state][d] } , v.prototype.start = function() { this.error = !1, this.state = g[this.state][y], this.state === u && (this.start = new Date, this.run(this), C(this, 0)) } , v.prototype.block = function(e) { e = void 0 === e ? 1 : e, this.blocks += e, this.blocks > 0 && (this.state = g[this.state].block) } , v.prototype.unblock = function(e) { return e = void 0 === e ? 1 : e, this.blocks -= e, 0 === this.blocks && this.state !== f && (this.state = u, C(this, 0)), this.blocks } , v.prototype.sleep = function(e) { e = void 0 === e ? 0 : e, this.state = g[this.state].sleep; var t = this; this.timeoutId = setTimeout(function() { t.timeoutId = null, t.state = u, C(t, 0) }, e) } , v.prototype.wait = function(e) { e.wait(this) } , v.prototype.wakeup = function() { this.state === p && (cancelTimeout(this.timeoutId), this.timeoutId = null, this.state = u, C(this, 0)) } , v.prototype.cancel = function() { this.state = g[this.state].cancel, this.permitsNeeded = 0, null !== this.timeoutId && (cancelTimeout(this.timeoutId), this.timeoutId = null), this.subtasks = [] } , v.prototype.fail = function(e) { if (this.error = !0, E(this, !0), e) e.error = this.error, e.swapTime = this.swapTime, e.userData = this.userData, C(e, 0); else { if (null !== this.parent) { for (var t = this.parent; null !== t.parent; ) t.error = this.error, t.swapTime = this.swapTime, t.userData = this.userData, t = t.parent; E(t, !0) } this.failureCallback && this.failureCallback(this) } } ; var m = function(e) { e.error = !1, e.state = g[e.state][y], setTimeout(function() { e.state === u && (e.swapTime = +new Date, e.run(e), C(e, 0)) }, 0) } , C = function(e, t) { var r = t > 30 || +new Date - e.swapTime > 20 , a = function(t) { if (t++, e.state === u) if (r && (e.swapTime = +new Date), e.subtasks.length > 0) { var a = e.subtasks.shift(); a.error = e.error, a.swapTime = e.swapTime, a.userData = e.userData, a.run(a), a.error || C(a, t) } else E(e), e.error || null !== e.parent && (e.parent.error = e.error, e.parent.swapTime = e.swapTime, e.parent.userData = e.userData, C(e.parent, t)) }; r ? setTimeout(a, 0) : a(t) } , E = function(e, t) { e.state = f, delete i[e.id], null === e.parent && (e.type in o ? 0 === o[e.type].length ? a.log.error(n, "[%s][%s] task queue empty [%s]", e.id, e.name, e.type) : o[e.type][0] !== e ? a.log.error(n, "[%s][%s] task not first in queue [%s]", e.id, e.name, e.type) : (o[e.type].shift(), 0 === o[e.type].length ? delete o[e.type] : o[e.type][0].start()) : a.log.error(n, "[%s][%s] task queue missing [%s]", e.id, e.name, e.type), t || (e.error && e.failureCallback ? e.failureCallback(e) : !e.error && e.successCallback && e.successCallback(e))) }; e.exports = a.task = a.task || {}, a.task.start = function(e) { var t = new v({ run: e.run, name: e.name || "?" }); t.type = e.type, t.successCallback = e.success || null, t.failureCallback = e.failure || null, t.type in o ? o[e.type].push(t) : (o[t.type] = [t], m(t)) } , a.task.cancel = function(e) { e in o && (o[e] = [o[e][0]]) } , a.task.createCondition = function() { var e = { tasks: {} }; return e.wait = function(t) { t.id in e.tasks || (t.block(), e.tasks[t.id] = t) } , e.notify = function() { var t = e.tasks; e.tasks = {}; for (var r in t) t[r].unblock() } , e } } ]) } ;'use strict'; { const C3 = self.C3; let cacheRegex = null; let lastRegex = ""; let lastFlags = ""; let regexMatches = []; let lastMatchesStr = ""; let lastMatchesRegex = ""; let lastMatchesFlags = ""; const forEachStack = C3.New(C3.ArrayStack); function ForEachOrdered_SortInstances(a, b) { const va = a[1]; const vb = b[1]; if (typeof va === "number" && typeof vb === "number") return va - vb; else { const sa = "" + va; const sb = "" + vb; if (sa < sb) return -1; else if (sa > sb) return 1; else return 0 } } C3.Plugins.System = class SystemPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts); this._loopStack = this._runtime.GetEventSheetManager().GetLoopStack(); this._eventStack = this._runtime.GetEventSheetManager().GetEventStack(); this._imagesLoadingTotal = 0; this._imagesLoadingComplete = 0; this._functionMaps = new Map } Release() { super.Release() } UpdateRender() { this._runtime.UpdateRender() } Trigger(method) { this._runtime.Trigger(method, null, null) } GetRegex(regex, flags) { if (!cacheRegex || regex !== lastRegex || flags !== lastFlags) { cacheRegex = new RegExp(regex,flags); lastRegex = regex; lastFlags = flags } cacheRegex.lastIndex = 0; return cacheRegex } GetRegexMatches(str, regex, flags) { if (str === lastMatchesStr && regex === lastMatchesRegex && flags === lastMatchesFlags) return regexMatches; const cacheRegex = this.GetRegex(regex, flags); regexMatches = str.match(cacheRegex); lastMatchesStr = str; lastMatchesRegex = regex; lastMatchesFlags = flags; return regexMatches } async _LoadTexturesForObjectClasses(layout, objectClasses) { if (!objectClasses.length) return; this._imagesLoadingTotal += objectClasses.length; const promises = []; for (const oc of objectClasses) promises.push(layout.MaybeLoadTexturesFor(oc)); await C3.PromiseAllWithProgress(promises, ()=>{ this._imagesLoadingComplete++ } ); this._imagesLoadingComplete++; if (this._imagesLoadingComplete === this._imagesLoadingTotal) { this._runtime.Trigger(C3.Plugins.System.Cnds.OnImageLoadingComplete, null, null); this._imagesLoadingComplete = 0; this._imagesLoadingTotal = 0 } } _UnloadTexturesForObjectClasses(layout, objectClasses) { for (const oc of objectClasses) if (oc.GetInstanceCount() === 0) layout.MaybeUnloadTexturesFor(oc) } _GetForEachStack() { return forEachStack } _Repeat(count) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); loop.SetEnd(count); if (isSolModifierAfterCnds) for (let i = 0; i < count && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else for (let i = 0; i < count && !loop.IsStopped(); ++i) { loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame) } eventStack.Pop(); loopStack.Pop(); return false } *_DebugRepeat(count) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); loop.SetEnd(count); if (isSolModifierAfterCnds) for (let i = 0; i < count && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else for (let i = 0; i < count && !loop.IsStopped(); ++i) { loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame) } eventStack.Pop(); loopStack.Pop(); return false } _While() { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); if (isSolModifierAfterCnds) for (let i = 0; !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); if (!currentEvent.Retrigger(oldFrame, newFrame)) loop.Stop(); eventSheetManager.PopSol(solModifiers) } else for (let i = 0; !loop.IsStopped(); ++i) { loop.SetIndex(i); if (!currentEvent.Retrigger(oldFrame, newFrame)) loop.Stop() } eventStack.Pop(); loopStack.Pop(); return false } *_DebugWhile() { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); if (isSolModifierAfterCnds) for (let i = 0; !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); const ret = yield*currentEvent.DebugRetrigger(oldFrame, newFrame); if (!ret) loop.Stop(); eventSheetManager.PopSol(solModifiers) } else for (let i = 0; !loop.IsStopped(); ++i) { loop.SetIndex(i); const ret = yield*currentEvent.DebugRetrigger(oldFrame, newFrame); if (!ret) loop.Stop() } eventStack.Pop(); loopStack.Pop(); return false } _For(name, start, end) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); loop.SetName(name); loop.SetEnd(end); if (end < start) if (isSolModifierAfterCnds) for (let i = start; i >= end && !loop.IsStopped(); --i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else for (let i = start; i >= end && !loop.IsStopped(); --i) { loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame) } else if (isSolModifierAfterCnds) for (let i = start; i <= end && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else for (let i = start; i <= end && !loop.IsStopped(); ++i) { loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame) } eventStack.Pop(); loopStack.Pop(); return false } *_DebugFor(name, start, end) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); loop.SetName(name); loop.SetEnd(end); if (end < start) if (isSolModifierAfterCnds) for (let i = start; i >= end && !loop.IsStopped(); --i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else for (let i = start; i >= end && !loop.IsStopped(); --i) { loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame) } else if (isSolModifierAfterCnds) for (let i = start; i <= end && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else for (let i = start; i <= end && !loop.IsStopped(); ++i) { loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame) } eventStack.Pop(); loopStack.Pop(); return false } _ForEach(objectClass) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); const isInContainer = objectClass.IsInContainer(); const sol = objectClass.GetCurrentSol(); const instances = forEachStack.Push(); C3.shallowAssignArray(instances, sol.GetInstances()); loop.SetEnd(instances.length); if (isSolModifierAfterCnds) for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); const inst = instances[i]; objectClass.GetCurrentSol().SetSinglePicked(inst); if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else { sol._SetSelectAll(false); const solInstances = sol._GetOwnInstances(); C3.clearArray(solInstances); solInstances.push(null); for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) { const inst = instances[i]; solInstances[0] = inst; if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame) } } eventStack.Pop(); loopStack.Pop(); C3.clearArray(instances); forEachStack.Pop(); return false } *_DebugForEach(objectClass) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); const isInContainer = objectClass.IsInContainer(); const sol = objectClass.GetCurrentSol(); const instances = forEachStack.Push(); C3.shallowAssignArray(instances, sol.GetInstances()); loop.SetEnd(instances.length); if (isSolModifierAfterCnds) for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); const inst = instances[i]; objectClass.GetCurrentSol().SetSinglePicked(inst); if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else { sol._SetSelectAll(false); const solInstances = sol._GetOwnInstances(); C3.clearArray(solInstances); solInstances.push(null); for (let i = 0, len = instances.length; i < len && !loop.IsStopped(); ++i) { const inst = instances[i]; solInstances[0] = inst; if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame) } } eventStack.Pop(); loopStack.Pop(); C3.clearArray(instances); forEachStack.Pop(); return false } _ForEachOrdered(objectClass, order) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const cnd = eventSheetManager.GetCurrentCondition(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); const isInContainer = objectClass.IsInContainer(); const sol = objectClass.GetCurrentSol(); const instancesData = forEachStack.Push(); C3.clearArray(instancesData); const iterInstances = sol.GetInstances(); loop.SetEnd(iterInstances.length); for (let i = 0, len = iterInstances.length; i < len; ++i) instancesData.push([iterInstances[i], cnd.ReevaluateParameter(1, i)]); instancesData.sort(ForEachOrdered_SortInstances); if (order === 1) instancesData.reverse(); if (isSolModifierAfterCnds) for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); const inst = instancesData[i][0]; objectClass.GetCurrentSol().SetSinglePicked(inst); if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else { sol._SetSelectAll(false); const solInstances = sol._GetOwnInstances(); C3.clearArray(solInstances); solInstances.push(null); for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) { const inst = instancesData[i][0]; solInstances[0] = inst; if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); currentEvent.Retrigger(oldFrame, newFrame) } } eventStack.Pop(); loopStack.Pop(); C3.clearArray(instancesData); forEachStack.Pop(); return false } *_DebugForEachOrdered(objectClass, order) { const eventSheetManager = this._runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const cnd = eventSheetManager.GetCurrentCondition(); const oldFrame = eventStack.GetCurrentStackFrame(); const currentEvent = oldFrame.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const isSolModifierAfterCnds = oldFrame.IsSolModifierAfterCnds(); const newFrame = eventStack.Push(currentEvent); const loopStack = eventSheetManager.GetLoopStack(); const loop = loopStack.Push(); const isInContainer = objectClass.IsInContainer(); const sol = objectClass.GetCurrentSol(); const instancesData = forEachStack.Push(); C3.clearArray(instancesData); const iterInstances = sol.GetInstances(); loop.SetEnd(iterInstances.length); for (let i = 0, len = iterInstances.length; i < len; ++i) instancesData.push([iterInstances[i], cnd.ReevaluateParameter(1, i)]); instancesData.sort(ForEachOrdered_SortInstances); if (order === 1) instancesData.reverse(); if (isSolModifierAfterCnds) for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) { eventSheetManager.PushCopySol(solModifiers); const inst = instancesData[i][0]; objectClass.GetCurrentSol().SetSinglePicked(inst); if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } else { sol._SetSelectAll(false); const solInstances = sol._GetOwnInstances(); C3.clearArray(solInstances); solInstances.push(null); for (let i = 0, len = instancesData.length; i < len && !loop.IsStopped(); ++i) { const inst = instancesData[i][0]; solInstances[0] = inst; if (isInContainer) inst.SetSiblingsSinglePicked(); loop.SetIndex(i); yield*currentEvent.DebugRetrigger(oldFrame, newFrame) } } eventStack.Pop(); loopStack.Pop(); C3.clearArray(instancesData); forEachStack.Pop(); return false } _GetFunctionMap(name, createIfMissing) { let ret = this._functionMaps.get(name); if (ret) return ret; if (!createIfMissing) return null; ret = { defaultFunc: null, strMap: new Map }; this._functionMaps.set(name, ret); return ret } _DoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers) { functionBlock.GetEventBlock().RunAsMappedFunctionCall(paramResults); if (hasAnySolModifiers) eventSheetManager.PopSol(solModifiers) } *_DebugDoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers) { yield*functionBlock.GetEventBlock().DebugRunAsMappedFunctionCall(paramResults); if (hasAnySolModifiers) eventSheetManager.PopSol(solModifiers) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.System.Type = class SystemType extends C3.DefendedBase { constructor(objectClass) { super(); this._objectClass = objectClass; this._runtime = objectClass.GetRuntime(); this._plugin = objectClass.GetPlugin() } OnCreate() {} Release() { this._objectClass = null; this._runtime = null; this._plugin = null } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.System.Instance = class SystemInstance extends C3.DefendedBase { constructor(inst, properties) { super(); this._inst = inst; this._objectClass = this._inst.GetObjectClass(); this._sdkType = this._objectClass.GetSdkType(); this._runtime = this._inst.GetRuntime() } Release() { this._inst = null; this._objectClass = null; this._sdkType = null; this._runtime = null } } } ;'use strict'; { const C3 = self.C3; const tmpPickArray = []; C3.Plugins.System.Cnds = { EveryTick() { return true }, OnLayoutStart() { return true }, OnLayoutEnd() { return true }, OnSuspend() { return true }, OnResume() { return true }, IsSuspended() { return this._runtime.IsSuspended() }, Else() { const frame = this._runtime.GetCurrentEventStackFrame(); if (frame.GetElseBranchRan()) return false; else return !frame.GetLastEventTrue() }, TriggerOnce() { const cnd = this._runtime.GetCurrentCondition(); const cndSavedData = cnd.GetSavedDataMap(); let lastTick = cndSavedData.get("TriggerOnce_lastTick"); if (typeof lastTick === "undefined") { lastTick = -1; cndSavedData.set("TriggerOnce_lastTick", -1) } const curTick = this._runtime.GetTickCount(); cndSavedData.set("TriggerOnce_lastTick", curTick); return this._runtime.IsLayoutFirstTick() || lastTick !== curTick - 1 }, Every(seconds) { const cnd = this._runtime.GetCurrentCondition(); const cndSavedData = cnd.GetSavedDataMap(); const lastTime = cndSavedData.get("Every_lastTime") || 0; const curTime = this._runtime.GetGameTime(); if (!cndSavedData.has("Every_seconds")) cndSavedData.set("Every_seconds", seconds); const thisSeconds = cndSavedData.get("Every_seconds"); if (curTime >= lastTime + thisSeconds) { cndSavedData.set("Every_lastTime", lastTime + thisSeconds); if (curTime >= cndSavedData.get("Every_lastTime") + .04) cndSavedData.set("Every_lastTime", curTime); cndSavedData.set("Every_seconds", seconds); return true } else if (curTime < lastTime - .1) cndSavedData.set("Every_lastTime", curTime); return false }, IsGroupActive(groupName) { const eventGroup = this._runtime.GetEventSheetManager().GetEventGroupByName(groupName); return eventGroup && eventGroup.IsGroupActive() }, IsPreview() { return this._runtime.IsPreview() }, IsMobile() { return C3.Platform.IsMobile }, OnLoadFinished() { return true }, OnCanvasSnapshot() { return true }, EffectsSupported() { return true }, OnSaveComplete() { return true }, OnSaveFailed() { return true }, OnLoadComplete() { return true }, OnLoadFailed() { return true }, ObjectUIDExists(uid) { return !!this._runtime.GetInstanceByUID(uid) }, IsOnPlatform(p) { switch (p) { case 0: return C3.Platform.Context === "browser"; case 1: return C3.Platform.OS === "iOS"; case 2: return C3.Platform.OS === "Android"; case 8: return C3.Platform.Context === "cordova"; case 9: return this._runtime.GetExportType() === "scirra-arcade"; case 10: return C3.Platform.Context === "nwjs"; case 13: return this._runtime.GetExportType() === "windows-uwp"; default: return false } }, RegexTest(str, regex, flags) { const cacheRegex = this.GetRegex(regex, flags); return cacheRegex.test(str) }, Compare(x, cmp, y) { return C3.compare(x, cmp, y) }, CompareBetween(x, a, b) { return x >= a && x <= b }, CompareVar(ev, cmp, val) { return C3.compare(ev.GetValue(), cmp, val) }, CompareBoolVar(ev) { return !!ev.GetValue() }, CompareTime(cmp, t) { const gameTime = this._runtime.GetGameTime(); if (cmp === 0) { const cnd = this._runtime.GetCurrentCondition(); const cndSavedData = cnd.GetSavedDataMap(); if (!cndSavedData.get("CompareTime_executed")) if (gameTime >= t) { cndSavedData.set("CompareTime_executed", true); return true } return false } else return C3.compare(gameTime, cmp, t) }, IsNaN(n) { return isNaN(n) }, AngleWithin(a1, within, a2) { return C3.angleDiff(C3.toRadians(a1), C3.toRadians(a2)) <= C3.toRadians(within) }, IsClockwiseFrom(a1, a2) { return C3.angleClockwise(C3.toRadians(a1), C3.toRadians(a2)) }, IsBetweenAngles(a, la, ua) { let angle = C3.toRadians(a); let lower = C3.toRadians(la); let upper = C3.toRadians(ua); let obtuse = !C3.angleClockwise(upper, lower); if (obtuse) return !(!C3.angleClockwise(angle, lower) && C3.angleClockwise(angle, upper)); else return C3.angleClockwise(angle, lower) && !C3.angleClockwise(angle, upper) }, IsValueType(v, t) { if (typeof v === "number") return t === 0; else return t === 1 }, EvaluateExpression(v) { return !!v }, PickByComparison(objectClass, exp, cmp, val) { if (!objectClass) return false; const forEachStack = this._GetForEachStack(); const tempInstances = forEachStack.Push(); const sol = objectClass.GetCurrentSol(); C3.shallowAssignArray(tempInstances, sol.GetInstances()); if (sol.IsSelectAll()) C3.clearArray(sol._GetOwnElseInstances()); const cnd = this._runtime.GetCurrentCondition(); let k = 0; for (let i = 0, len = tempInstances.length; i < len; ++i) { const inst = tempInstances[i]; tempInstances[k] = inst; exp = cnd.ReevaluateParameter(1, i); val = cnd.ReevaluateParameter(3, i); if (C3.compare(exp, cmp, val)) ++k; else sol._PushElseInstance(inst) } C3.truncateArray(tempInstances, k); sol.SetArrayPicked(tempInstances); const ret = !!tempInstances.length; C3.clearArray(tempInstances); forEachStack.Pop(); objectClass.ApplySolToContainer(); return ret }, PickByEvaluate(objectClass, exp) { if (!objectClass) return false; const forEachStack = this._GetForEachStack(); const tempInstances = forEachStack.Push(); const sol = objectClass.GetCurrentSol(); C3.shallowAssignArray(tempInstances, sol.GetInstances()); if (sol.IsSelectAll()) C3.clearArray(sol._GetOwnElseInstances()); const cnd = this._runtime.GetCurrentCondition(); let k = 0; for (let i = 0, len = tempInstances.length; i < len; ++i) { const inst = tempInstances[i]; tempInstances[k] = inst; exp = cnd.ReevaluateParameter(1, i); if (exp) ++k; else sol._PushElseInstance(inst) } C3.truncateArray(tempInstances, k); sol.SetArrayPicked(tempInstances); const ret = !!tempInstances.length; C3.clearArray(tempInstances); forEachStack.Pop(); objectClass.ApplySolToContainer(); return ret }, PickNth(objectClass, index) { if (!objectClass) return false; const sol = objectClass.GetCurrentSol(); const instances = sol.GetInstances(); index = Math.floor(index); if (index >= instances.length) return false; const inst = instances[index]; sol.PickOne(inst); objectClass.ApplySolToContainer(); return true }, PickRandom(objectClass) { if (!objectClass) return false; const sol = objectClass.GetCurrentSol(); const instances = sol.GetInstances(); const index = Math.floor(this._runtime.Random() * instances.length); if (index >= instances.length) return false; const inst = instances[index]; sol.PickOne(inst); objectClass.ApplySolToContainer(); return true }, PickAll(objectClass) { if (!objectClass) return false; if (!objectClass.GetInstanceCount()) return false; const sol = objectClass.GetCurrentSol(); sol._SetSelectAll(true); objectClass.ApplySolToContainer(); return true }, PickOverlappingPoint(objectClass, x, y) { if (!objectClass) return false; const sol = objectClass.GetCurrentSol(); const instances = sol.GetInstances(); const currentEvent = this._runtime.GetCurrentEvent(); const isOrBlock = currentEvent.IsOrBlock(); const isInverted = this._runtime.GetCurrentCondition().IsInverted(); if (sol.IsSelectAll()) { C3.shallowAssignArray(tmpPickArray, instances); sol.ClearArrays(); sol._SetSelectAll(false) } else if (isOrBlock) { C3.shallowAssignArray(tmpPickArray, sol._GetOwnElseInstances()); C3.clearArray(sol._GetOwnElseInstances()) } else { C3.shallowAssignArray(tmpPickArray, sol._GetOwnInstances()); C3.clearArray(sol._GetOwnInstances()) } for (let i = 0, len = tmpPickArray.length; i < len; ++i) { const inst = tmpPickArray[i]; if (C3.xor(inst.GetWorldInfo().ContainsPoint(x, y), isInverted)) sol._PushInstance(inst); else sol._PushElseInstance(inst) } objectClass.ApplySolToContainer(); return C3.xor(!!sol._GetOwnInstances().length, isInverted) }, PickLastCreated(objectClass) { if (!objectClass) return false; const isFamily = objectClass.IsFamily(); let pick = null; const instancesPendingCreate = this._runtime._GetInstancesPendingCreate(); for (let i = instancesPendingCreate.length - 1; i >= 0; --i) { const inst = instancesPendingCreate[i]; if (isFamily) { if (inst.GetObjectClass().BelongsToFamily(objectClass)) { pick = inst; break } } else if (inst.GetObjectClass() === objectClass) { pick = inst; break } } if (!pick) { const instances = objectClass.GetInstances(); if (instances.length) pick = instances[instances.length - 1] } if (!pick) return false; const sol = objectClass.GetCurrentSol(); sol.PickOne(pick); objectClass.ApplySolToContainer(); return true }, Repeat(count) { if (this._runtime.IsDebugging()) return this._DebugRepeat(count); else return this._Repeat(count) }, While() { if (this._runtime.IsDebugging()) return this._DebugWhile(); else return this._While() }, For(name, start, end) { if (this._runtime.IsDebugging()) return this._DebugFor(name, start, end); else return this._For(name, start, end) }, ForEach(objectClass) { if (this._runtime.IsDebugging()) return this._DebugForEach(objectClass); else return this._ForEach(objectClass) }, ForEachOrdered(objectClass, expression, order) { if (this._runtime.IsDebugging()) return this._DebugForEachOrdered(objectClass, order); else return this._ForEachOrdered(objectClass, order) }, LayerVisible(layer) { return layer ? layer.IsVisible() : false }, LayerEmpty(layer) { return layer ? !layer.GetInstanceCount() : false }, LayerCmpOpacity(layer, cmp, o) { if (!layer) return false; return C3.compare(layer.GetOpacity() * 100, cmp, o) }, OnImageLoadingComplete() { return true }, IsLoadingImages() { return this._imagesLoadingTotal > 0 } } } ;'use strict'; { const C3 = self.C3; function SortZOrderList(a, b) { const layerA = a[0]; const layerB = b[0]; const diff = layerA - layerB; if (diff !== 0) return diff; const indexA = a[1]; const indexB = b[1]; return indexA - indexB } function SortInstancesByValue(a, b) { return a[1] - b[1] } const tempZOrderList = []; const tempInstValues = []; const tempRect = C3.New(C3.Rect); const tempColor = C3.New(C3.Color); C3.Plugins.System.Acts = { SetVar(ev, x) { ev.SetValue(x) }, AddVar(ev, x) { if (ev.IsNumber() && typeof x !== "number") x = parseFloat(x); ev.SetValue(ev.GetValue() + x) }, SubVar(ev, x) { if (!ev.IsNumber()) return; ev.SetValue(ev.GetValue() - x) }, SetBoolVar(ev, x) { ev.SetValue(!!x) }, ToggleBoolVar(ev) { ev.SetValue(!ev.GetValue()) }, ResetGlobals() { this._runtime.GetEventSheetManager().ResetAllGlobalsToInitialValue() }, CreateObject(objectClass, layer, x, y) { if (!objectClass || !layer) return; const inst = this._runtime.CreateInstance(objectClass, layer, x, y); if (!inst) return; const eventSheetManager = this._runtime.GetEventSheetManager(); eventSheetManager.BlockFlushingInstances(true); inst._TriggerOnCreated(); if (inst.IsInContainer()) for (const s of inst.siblings()) s._TriggerOnCreated(); eventSheetManager.BlockFlushingInstances(false); objectClass.GetCurrentSol().SetSinglePicked(inst); if (inst.IsInContainer()) inst.SetSiblingsSinglePicked() }, CreateObjectByName(objectClassName, layer, x, y) { if (!objectClassName || !layer) return; const objectClass = this._runtime.GetObjectClassByName(objectClassName); if (!objectClass) return; C3.Plugins.System.Acts.CreateObject.call(this, objectClass, layer, x, y) }, RecreateInitialObjects(objectClass, x1, y1, x2, y2, sourceLayoutName, sourceLayerParam, offsetX, offsetY) { if (!objectClass) return; let sourceLayout = this._runtime.GetCurrentLayout(); if (sourceLayoutName) { const lookupLayout = this._runtime.GetLayoutManager().GetLayoutByName(sourceLayoutName); if (lookupLayout) sourceLayout = lookupLayout; else return } let sourceLayer = null; if (typeof sourceLayerParam !== "number" || sourceLayerParam >= 0) { sourceLayer = sourceLayout.GetLayer(sourceLayerParam); if (!sourceLayer) return } tempRect.set(x1, y1, x2, y2); const allCreatedInstances = sourceLayout.RecreateInitialObjects(objectClass, tempRect, sourceLayer, offsetX, offsetY); objectClass.GetCurrentSol().SetArrayPicked(allCreatedInstances); objectClass.ApplySolToContainer() }, StopLoop() { const loopStack = this._loopStack; if (!loopStack.IsInLoop()) return; loopStack.GetCurrent().Stop() }, SetGroupActive(groupName, a) { const group = this._runtime.GetEventSheetManager().GetEventGroupByName(groupName); if (!group) return; if (a === 0) group.SetGroupActive(false); else if (a === 1) group.SetGroupActive(true); else group.SetGroupActive(!group.IsGroupActive()) }, SetTimescale(ts) { this._runtime.SetTimeScale(ts) }, SetObjectTimescale(objectClass, ts) { if (ts < 0) ts = 0; if (!objectClass) return; const sol = objectClass.GetCurrentSol(); const instances = sol.GetInstances(); for (const inst of instances) inst.SetTimeScale(ts) }, RestoreObjectTimescale(objectClass) { if (!objectClass) return; const sol = objectClass.GetCurrentSol(); const instances = sol.GetInstances(); for (const inst of instances) inst.RestoreTimeScale() }, Wait(seconds) { if (seconds < 0) return; this._runtime.GetEventSheetManager().AddScheduledWait().InitTimer(seconds); return true }, WaitForSignal(tag) { this._runtime.GetEventSheetManager().AddScheduledWait().InitSignal(tag); return true }, WaitForPreviousActions() { const eventSheetManager = this._runtime.GetEventSheetManager(); eventSheetManager.AddScheduledWait().InitPromise(eventSheetManager.GetPromiseForAllAsyncActions()); return true }, Signal(tag) { const lowerTag = tag.toLowerCase(); for (const w of this._runtime.GetEventSheetManager().scheduledWaits()) if (w.IsSignal() && w.GetSignalTag() === lowerTag) w.SetSignalled() }, async SnapshotCanvas(format, quality, x, y, width, height) { const canvasManager = this._runtime.GetCanvasManager(); if (!canvasManager) return; this.UpdateRender(); await canvasManager.SnapshotCanvas(format === 0 ? "image/png" : "image/jpeg", quality / 100, x, y, width, height); await this._runtime.TriggerAsync(C3.Plugins.System.Cnds.OnCanvasSnapshot, null) }, SetCanvasSize(w, h) { if (w <= 0 || h <= 0) return; this._runtime.SetViewportSize(w, h); const currentLayout = this._runtime.GetCurrentLayout(); currentLayout.BoundScrolling(); for (const layer of currentLayout.GetLayers()) layer.UpdateViewport(); const canvasManager = this._runtime.GetCanvasManager(); if (!canvasManager) return; if (canvasManager.GetCurrentFullscreenMode() === "off") canvasManager.SetSize(canvasManager.GetLastWidth(), canvasManager.GetLastHeight(), true); else { this._runtime.SetOriginalViewportSize(w, h); canvasManager.SetSize(canvasManager.GetLastWidth(), canvasManager.GetLastHeight(), true) } this._runtime.UpdateRender() }, SetFullscreenQuality(q) { const canvasManager = this._runtime.GetCanvasManager(); if (!canvasManager) return; if (canvasManager.GetCurrentFullscreenMode() === "off") return; canvasManager.SetFullscreenScalingQuality(q !== 0 ? "high" : "low"); canvasManager.SetSize(canvasManager.GetLastWidth(), canvasManager.GetLastHeight(), true) }, SaveState(slot) { this._runtime.SaveToSlot(slot) }, LoadState(slot) { this._runtime.LoadFromSlot(slot) }, LoadStateJSON(jsonStr) { this._runtime.LoadFromJsonString(jsonStr) }, SetHalfFramerateMode(m) {}, ResetPersisted() { for (const layout of this._runtime.GetLayoutManager().GetAllLayouts()) layout.ResetPersistData() }, SetPixelRounding(m) { this._runtime.SetPixelRoundingEnabled(m !== 0) }, SetMinimumFramerate(fps) { this._runtime.SetMinimumFramerate(fps) }, SortZOrderByInstVar(objectClass, instVar) { if (!objectClass) return; const sol = objectClass.GetCurrentSol(); const pickedInstances = sol.GetInstances(); const zOrderList = tempZOrderList; const instValues = tempInstValues; const layout = this._runtime.GetCurrentLayout(); const isFamily = objectClass.IsFamily(); const familyIndex = objectClass.GetFamilyIndex(); for (let i = 0, len = pickedInstances.length; i < len; ++i) { const inst = pickedInstances[i]; const wi = inst.GetWorldInfo(); if (!wi) continue; let value; if (isFamily) value = inst.GetInstanceVariableValue(instVar + inst.GetObjectClass().GetFamilyInstanceVariableOffset(familyIndex)); else value = inst.GetInstanceVariableValue(instVar); zOrderList.push([wi.GetLayer().GetIndex(), wi.GetZIndex()]); instValues.push([inst, value]) } if (!zOrderList.length) return; zOrderList.sort(SortZOrderList); instValues.sort(SortInstancesByValue); let anyChanged = false; for (let i = 0, len = zOrderList.length; i < len; ++i) { const inst = instValues[i][0]; const layer = layout.GetLayerByIndex(zOrderList[i][0]); const toZ = zOrderList[i][1]; const layerInstances = layer._GetInstances(); if (layerInstances[toZ] !== inst) { layerInstances[toZ] = inst; inst.GetWorldInfo()._SetLayer(layer); layer.SetZIndicesChanged(); anyChanged = true } } if (anyChanged) this._runtime.UpdateRender(); C3.clearArray(tempZOrderList); C3.clearArray(tempInstValues) }, GoToLayout(layout) { if (this._runtime.IsLoading()) return; const layoutManager = this._runtime.GetLayoutManager(); if (layoutManager.IsPendingChangeMainLayout()) return; layoutManager.ChangeMainLayout(layout) }, GoToLayoutByName(layoutName) { if (this._runtime.IsLoading()) return; const layoutManager = this._runtime.GetLayoutManager(); if (layoutManager.IsPendingChangeMainLayout()) return; const toLayout = layoutManager.GetLayoutByName(layoutName); if (toLayout) layoutManager.ChangeMainLayout(toLayout) }, NextPrevLayout(prev) { if (this._runtime.IsLoading()) return; const layoutManager = this._runtime.GetLayoutManager(); if (layoutManager.IsPendingChangeMainLayout()) return; const allLayouts = layoutManager.GetAllLayouts(); const index = allLayouts.indexOf(layoutManager.GetMainRunningLayout()); if (prev && index === 0) return; if (!prev && index === allLayouts.length - 1) return; const toLayout = allLayouts[index + (prev ? -1 : 1)]; layoutManager.ChangeMainLayout(toLayout) }, RestartLayout() { if (this._runtime.IsLoading()) return; const layoutManager = this._runtime.GetLayoutManager(); if (layoutManager.IsPendingChangeMainLayout()) return; layoutManager.ChangeMainLayout(layoutManager.GetMainRunningLayout()); this._runtime.GetEventSheetManager().ResetAllGroupsInitialActivation() }, SetLayerVisible(layer, v) { if (!layer) return; layer.SetVisible(v) }, SetLayerOpacity(layer, o) { if (!layer) return; layer.SetOpacity(o / 100) }, SetLayerScale(layer, s) { if (!layer) return; layer.SetOwnScale(s) }, SetLayerScaleRate(layer, r) { if (!layer) return; layer.SetScaleRate(r) }, SetLayerAngle(layer, a) { if (!layer) return; a = C3.clampAngle(C3.toRadians(+a)); if (layer.GetOwnAngle() === a) return; layer.SetAngle(a); this.UpdateRender() }, SetLayerParallax(layer, px, py) { if (!layer) return; layer.SetParallax(px / 100, py / 100) }, SetLayerZElevation(layer, z) { if (!layer) return; layer.SetZElevation(z) }, SetLayerBackground(layer, rgb) { if (!layer) return; tempColor.setFromRgbValue(rgb); tempColor.clamp(); const layerBgColor = layer.GetBackgroundColor(); if (layerBgColor.equalsIgnoringAlpha(tempColor)) return; layerBgColor.copyRgb(tempColor); this.UpdateRender() }, SetLayerTransparent(layer, t) { if (!layer) return; t = !!t; if (layer.IsTransparent() === t) return; layer.SetTransparent(t); this.UpdateRender() }, SetLayerBlendMode(layer, bm) { if (!layer) return; if (layer.GetBlendMode() === bm) return; layer.SetBlendMode(bm); this.UpdateRender() }, SetLayerEffectEnabled(layer, enabled, effectName) { if (!layer) return; const effectList = layer.GetEffectList(); const effectType = effectList.GetEffectTypeByName(effectName); if (!effectType) return; const e = enabled === 1; if (effectType.IsActive() === e) return; effectType.SetActive(e); effectList.UpdateActiveEffects(); this._runtime.UpdateRender() }, SetLayerEffectParam(layer, effectName, paramIndex, value) { if (!layer) return; const effectList = layer.GetEffectList(); const effectType = effectList.GetEffectTypeByName(effectName); if (!effectType) return; const effectTypeIndex = effectType.GetIndex(); const paramsArr = effectList.GetEffectParametersForIndex(effectTypeIndex); paramIndex = Math.floor(paramIndex); if (paramIndex < 0 || paramIndex >= paramsArr.length) return; const paramType = effectType.GetShaderProgram().GetParameterType(paramIndex); if (paramType === "color") { tempColor.setFromRgbValue(value); const curColor = paramsArr[paramIndex]; if (tempColor.equalsIgnoringAlpha(curColor)) return; curColor.copyRgb(tempColor) } else { if (paramType === "percent") value /= 100; if (paramsArr[paramIndex] === value) return; paramsArr[paramIndex] = value } if (effectType.IsActive()) this._runtime.UpdateRender() }, SetLayerForceOwnTexture(layer, f) { if (!layer) return; f = !!f; if (layer.IsForceOwnTexture() === f) return; layer.SetForceOwnTexture(f); this.UpdateRender() }, SetLayoutScale(s) { const layout = this._runtime.GetCurrentLayout(); if (layout.GetScale() === s) return; layout.SetScale(s); this.UpdateRender() }, SetLayoutAngle(a) { a = C3.clampAngle(C3.toRadians(+a)); const layout = this._runtime.GetCurrentLayout(); if (layout.GetAngle() === a) return; layout.SetAngle(a); this.UpdateRender() }, SetLayoutEffectEnabled(enabled, effectName) { const layout = this._runtime.GetCurrentLayout(); const effectList = layout.GetEffectList(); const effectType = effectList.GetEffectTypeByName(effectName); if (!effectType) return; const e = enabled === 1; if (effectType.IsActive() === e) return; effectType.SetActive(e); effectList.UpdateActiveEffects(); this._runtime.UpdateRender() }, SetLayoutEffectParam(effectName, paramIndex, value) { const layout = this._runtime.GetCurrentLayout(); const effectList = layout.GetEffectList(); const effectType = effectList.GetEffectTypeByName(effectName); if (!effectType) return; const effectTypeIndex = effectType.GetIndex(); const paramsArr = effectList.GetEffectParametersForIndex(effectTypeIndex); paramIndex = Math.floor(paramIndex); if (paramIndex < 0 || paramIndex >= paramsArr.length) return; const paramType = effectType.GetShaderProgram().GetParameterType(paramIndex); if (paramType === "color") { tempColor.setFromRgbValue(value); const curColor = paramsArr[paramIndex]; if (tempColor.equalsIgnoringAlpha(curColor)) return; curColor.copyRgb(tempColor) } else { if (paramType === "percent") value /= 100; if (paramsArr[paramIndex] === value) return; paramsArr[paramIndex] = value } if (effectType.IsActive()) this._runtime.UpdateRender() }, ScrollX(x) { const layout = this._runtime.GetCurrentLayout(); layout.SetScrollX(x) }, ScrollY(y) { const layout = this._runtime.GetCurrentLayout(); layout.SetScrollY(y) }, Scroll(x, y) { const layout = this._runtime.GetCurrentLayout(); layout.SetScrollX(x); layout.SetScrollY(y) }, ScrollToObject(objectClass) { if (!objectClass) return; const inst = objectClass.GetFirstPicked(); if (!inst) return; const wi = inst.GetWorldInfo(); if (!wi) return; const layout = this._runtime.GetCurrentLayout(); layout.SetScrollX(wi.GetX()); layout.SetScrollY(wi.GetY()) }, async LoadObjectTextures(objectClass) { const layout = this._runtime.GetMainRunningLayout(); if (!layout || !objectClass || this._runtime.IsLoading()) return; const objectClasses = objectClass.IsFamily() ? objectClass.GetFamilyMembers() : [objectClass]; await this._LoadTexturesForObjectClasses(layout, objectClasses) }, async LoadObjectTexturesByName(objectClassName) { await C3.Plugins.System.Acts.LoadObjectTextures.call(this, this._runtime.GetObjectClassByName(objectClassName)) }, UnloadObjectTextures(objectClass) { const layout = this._runtime.GetMainRunningLayout(); if (!layout || !objectClass) return; const objectClasses = objectClass.IsFamily() ? objectClass.GetFamilyMembers() : [objectClass]; this._UnloadTexturesForObjectClasses(layout, objectClasses) }, UnloadObjectTexturesByName(objectClassName) { C3.Plugins.System.Acts.UnloadObjectTexturesByName.call(this, this._runtime.GetObjectClassByName(objectClassName)) }, UnloadUnusedTextures() { const layout = this._runtime.GetMainRunningLayout(); if (!layout) return; const objectClasses = layout._GetTextureLoadedObjectTypes(); this._UnloadTexturesForObjectClasses(layout, objectClasses) }, async LoadLayoutTextures(loadLayout) { const curLayout = this._runtime.GetMainRunningLayout(); if (!loadLayout || !curLayout || this._runtime.IsLoading()) return; await this._LoadTexturesForObjectClasses(curLayout, loadLayout._GetInitialObjectClasses()) }, async LoadLayoutTexturesByName(layoutName) { const curLayout = this._runtime.GetMainRunningLayout(); const loadLayout = this._runtime.GetLayoutManager().GetLayoutByName(layoutName); if (!loadLayout || !curLayout || this._runtime.IsLoading()) return; await this._LoadTexturesForObjectClasses(curLayout, loadLayout._GetInitialObjectClasses()) }, SetFunctionReturnValue(v) { const frame = this._eventStack.GetCurrentExpFuncStackFrame(); if (!frame) return; switch (frame.GetFunctionReturnType()) { case 1: if (typeof v === "number") frame.SetFunctionReturnValue(v); break; case 2: if (typeof v === "string") frame.SetFunctionReturnValue(v); break; case 3: frame.SetFunctionReturnValue(v); break } }, MapFunction(name, str, functionBlock) { const mapEntry = this._GetFunctionMap(name.toLowerCase(), true); const strMap = mapEntry.strMap; const lowerStr = str.toLowerCase(); if (strMap.has(lowerStr)) console.warn(`[Construct 3] Function map '${name}' string '${str}' already in map; overwriting entry`); const firstFunctionBlock = C3.first(strMap.values()) || mapEntry.defaultFunc; if (firstFunctionBlock) { const firstReturnsValue = firstFunctionBlock.GetReturnType() !== 0; const curReturnsValue = functionBlock.GetReturnType() !== 0; if (firstReturnsValue !== curReturnsValue) { console.error(`[Construct 3] Function map '${name}' string '${str}' function return type not compatible with other functions in the map; entry ignored`); return } } strMap.set(lowerStr, functionBlock) }, MapFunctionDefault(name, functionBlock) { const mapEntry = this._GetFunctionMap(name.toLowerCase(), true); if (mapEntry.defaultFunc) console.warn(`[Construct 3] Function map '${name}' already has a default; overwriting entry`); const firstFunctionBlock = C3.first(mapEntry.strMap.values()) || mapEntry.defaultFunc; if (firstFunctionBlock) { const firstReturnsValue = firstFunctionBlock.GetReturnType() !== 0; const curReturnsValue = functionBlock.GetReturnType() !== 0; if (firstReturnsValue !== curReturnsValue) { console.error(`[Construct 3] Function map '${name}' default: function return type not compatible with other functions in the map; entry ignored`); return } } mapEntry.defaultFunc = functionBlock }, CallMappedFunction(name, str, forwardParams) { forwardParams = Math.floor(forwardParams); const mapEntry = this._GetFunctionMap(name.toLowerCase(), false); if (!mapEntry) { console.warn(`[Construct 3] Call mapped function: map name '${name}' not found; call ignored`); return } let functionBlock = mapEntry.strMap.get(str.toLowerCase()); if (!functionBlock) if (mapEntry.defaultFunc) { functionBlock = mapEntry.defaultFunc; forwardParams = 0 } else { console.warn(`[Construct 3] Call mapped function: no function associated with map '${name}' string '${str}'; call ignored (consider setting a default)`); return } if (!functionBlock.IsEnabled()) return; if (functionBlock.GetReturnType() !== 0) { console.warn(`[Construct 3] Call mapped function: map '${name}' string '${str}' has a return type so cannot be called`); return } const runtime = this._runtime; const eventSheetManager = runtime.GetEventSheetManager(); const currentEvent = eventSheetManager.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiersIncludingParents(); const hasAnySolModifiers = solModifiers.length > 0; if (hasAnySolModifiers) eventSheetManager.PushCleanSol(solModifiers); const paramResults = []; const callerFunctionBlock = eventSheetManager.FindFirstFunctionBlockParent(currentEvent); if (callerFunctionBlock) { const callerParameters = callerFunctionBlock.GetFunctionParameters(); for (let i = forwardParams, len = callerParameters.length; i < len; ++i) paramResults.push(callerParameters[i].GetValue()) } const calleeParameters = functionBlock.GetFunctionParameters(); for (let i = paramResults.length, len = calleeParameters.length; i < len; ++i) paramResults.push(calleeParameters[i].GetInitialValue()); if (runtime.IsDebugging()) return this._DebugDoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers); else return this._DoCallMappedFunction(eventSheetManager, functionBlock, paramResults, hasAnySolModifiers, solModifiers) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.System.Exps = { int: function(x) { if (typeof x === "string") { x = parseInt(x, 10); if (isNaN(x)) x = 0 } return Math.floor(x) }, float: function(x) { if (typeof x === "string") { x = parseFloat(x); if (isNaN(x)) x = 0 } return x }, str(x) { return x.toString() }, len(x) { if (typeof x === "string") return x.length; else return 0 }, random(a, b) { if (typeof b === "undefined") return this._runtime.Random() * a; else return this._runtime.Random() * (b - a) + a }, choose(...args) { const index = Math.floor(this._runtime.Random() * args.length); return args[index] }, pi() { return Math.PI }, infinity() { return Infinity }, sqrt(v) { return Math.sqrt(v) }, abs(v) { return Math.abs(v) }, round(v) { return Math.round(v) }, floor(v) { return Math.floor(v) }, ceil(v) { return Math.ceil(v) }, sign(v) { return Math.sign(v) }, sin(x) { return Math.sin(C3.toRadians(x)) }, cos(x) { return Math.cos(C3.toRadians(x)) }, tan(x) { return Math.tan(C3.toRadians(x)) }, asin(x) { return C3.toDegrees(Math.asin(x)) }, acos(x) { return C3.toDegrees(Math.acos(x)) }, atan(x) { return C3.toDegrees(Math.atan(x)) }, exp(x) { return Math.exp(x) }, ln(x) { return Math.log(x) }, log10(x) { return Math.log(x) / Math.LN10 }, max(...args) { let ret = args[0]; if (typeof ret !== "number") ret = 0; for (let i = 1, len = args.length; i < len; ++i) { let n = args[i]; if (typeof n !== "number") continue; if (ret < n) ret = n } return ret }, min(...args) { let ret = args[0]; if (typeof ret !== "number") ret = 0; for (let i = 1, len = args.length; i < len; ++i) { let n = args[i]; if (typeof n !== "number") continue; if (ret > n) ret = n } return ret }, clamp(x, l, u) { return C3.clamp(x, l, u) }, distance(x1, y1, x2, y2) { return C3.distanceTo(x1, y1, x2, y2) }, angle(x1, y1, x2, y2) { return C3.toDegrees(C3.angleTo(x1, y1, x2, y2)) }, lerp(a, b, x) { return C3.lerp(a, b, x) }, unlerp(a, b, y) { return C3.unlerp(a, b, y) }, qarp(a, b, c, x) { return C3.qarp(a, b, c, x) }, cubic(a, b, c, d, x) { return C3.cubic(a, b, c, d, x) }, cosp(a, b, x) { return C3.cosp(a, b, x) }, anglediff(a, b) { return C3.toDegrees(C3.angleDiff(C3.toRadians(a), C3.toRadians(b))) }, anglelerp(a, b, x) { return C3.toDegrees(C3.angleLerp(C3.toRadians(a), C3.toRadians(b), x)) }, anglerotate(a, b, c) { return C3.toDegrees(C3.angleRotate(C3.toRadians(a), C3.toRadians(b), C3.toRadians(c))) }, setbit(n, b, v) { n = n | 0; b = b | 0; v = v !== 0 ? 1 : 0; return n & ~(1 << b) | v << b }, togglebit(n, b) { n = n | 0; b = b | 0; return n ^ 1 << b }, getbit(n, b) { n = n | 0; b = b | 0; return n & 1 << b ? 1 : 0 }, newline() { return "\n" }, uppercase(s) { return typeof s === "string" ? s.toUpperCase() : "" }, lowercase(s) { return typeof s === "string" ? s.toLowerCase() : "" }, left(text, n) { return typeof text === "string" ? text.substr(0, n) : "" }, mid(text, index, count) { if (typeof text !== "string") return ""; if (count < 0) return text.substr(index); else return text.substr(index, count) }, right(text, n) { return typeof text === "string" ? text.substr(text.length - n) : "" }, trim(text) { return typeof text === "string" ? text.trim() : "" }, tokenat(text, index, sep) { if (typeof text !== "string" || typeof sep !== "string") return ""; let arr = text.split(sep); index = Math.floor(index); if (index < 0 || index >= arr.length) return ""; return arr[index] }, tokencount(text, sep) { if (typeof text !== "string" || typeof sep !== "string" || !text.length) return 0; return text.split(sep).length }, find(text, searchStr) { if (typeof text === "string" && typeof searchStr === "string") return text.search(new RegExp(C3.EscapeRegex(searchStr),"i")); else return -1 }, findcase(text, searchStr) { if (typeof text === "string" && typeof searchStr === "string") return text.search(new RegExp(C3.EscapeRegex(searchStr),"")); else return -1 }, replace(text, find, replace) { if (typeof text === "string" && typeof find === "string" && typeof replace === "string") return text.replace(new RegExp(C3.EscapeRegex(find),"gi"), replace); else return typeof text === "string" ? text : "" }, regexsearch(text, regex, flags) { const cacheRegex = this.GetRegex(regex, flags); return text ? text.search(cacheRegex) : -1 }, regexreplace(text, regex, flags, replace) { const cacheRegex = this.GetRegex(regex, flags); return text ? text.replace(cacheRegex, replace) : "" }, regexmatchcount(text, regex, flags) { const matches = this.GetRegexMatches(text.toString(), regex, flags); return matches ? matches.length : 0 }, regexmatchat(text, regex, flags, index) { index = Math.floor(index); const matches = this.GetRegexMatches(text.toString(), regex, flags); if (!matches || index < 0 || index >= matches.length) return ""; else return matches[index] }, zeropad(n, d) { let s = n < 0 ? "-" : ""; if (n < 0) n = -n; const zeroes = d - n.toString().length; s += "0".repeat(Math.max(zeroes, 0)); return s + n.toString() }, urlencode(s) { return encodeURIComponent(s) }, urldecode(s) { return decodeURIComponent(s) }, dt() { return this._runtime._GetDtFast() }, timescale() { return this._runtime.GetTimeScale() }, wallclocktime() { return (Date.now() - this._runtime.GetStartTime()) / 1E3 }, unixtime() { return Date.now() }, time() { return this._runtime.GetGameTime() }, tickcount() { return this._runtime.GetTickCount() }, objectcount() { return this._runtime.GetObjectCount() }, fps() { return this._runtime.GetFPS() }, cpuutilisation() { return this._runtime.GetMainThreadTime() }, gpuutilisation() { return this._runtime.GetGPUUtilisation() }, windowwidth() { return this._runtime.GetCanvasManager().GetDeviceWidth() }, windowheight() { return this._runtime.GetCanvasManager().GetDeviceHeight() }, originalwindowwidth() { return this._runtime.GetOriginalViewportWidth() }, originalwindowheight() { return this._runtime.GetOriginalViewportHeight() }, originalviewportwidth() { return this._runtime.GetOriginalViewportWidth() }, originalviewportheight() { return this._runtime.GetOriginalViewportHeight() }, scrollx() { return this._runtime.GetCurrentLayout().GetScrollX() }, scrolly() { return this._runtime.GetCurrentLayout().GetScrollY() }, layoutname() { return this._runtime.GetCurrentLayout().GetName() }, layoutscale() { return this._runtime.GetCurrentLayout().GetScale() }, layoutangle() { return C3.toDegrees(this._runtime.GetCurrentLayout().GetAngle()) }, layoutwidth() { return this._runtime.GetCurrentLayout().GetWidth() }, layoutheight() { return this._runtime.GetCurrentLayout().GetHeight() }, viewportleft(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetViewport().getLeft() : 0 }, viewporttop(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetViewport().getTop() : 0 }, viewportright(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetViewport().getRight() : 0 }, viewportbottom(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetViewport().getBottom() : 0 }, viewportwidth(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetViewport().width() : 0 }, viewportheight(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetViewport().height() : 0 }, canvastolayerx(layerParam, x, y) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.CanvasCssToLayer(x, y)[0] : 0 }, canvastolayery(layerParam, x, y) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.CanvasCssToLayer(x, y)[1] : 0 }, layertocanvasx(layerParam, x, y) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.LayerToCanvasCss(x, y)[0] : 0 }, layertocanvasy(layerParam, x, y) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.LayerToCanvasCss(x, y)[1] : 0 }, layerscale(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetOwnScale() : 0 }, layerangle(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? C3.toDegrees(layer.GetOwnAngle()) : 0 }, layeropacity(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetOpacity() * 100 : 0 }, layerscalerate(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetScaleRate() : 0 }, layerparallaxx(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetParallaxX() * 100 : 0 }, layerparallaxy(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetParallaxY() * 100 : 0 }, layerzelevation(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetZElevation() : 0 }, layerindex(layerParam) { const layer = this._runtime.GetCurrentLayout().GetLayer(layerParam); return layer ? layer.GetIndex() : -1 }, canvassnapshot() { const canvasManager = this._runtime.GetCanvasManager(); if (!canvasManager) return ""; return canvasManager.GetCanvasSnapshotUrl() }, loopindex(name) { const loopStack = this._loopStack; if (!loopStack.IsInLoop()) return 0; if (name) { const loop = loopStack.FindByName(name); return loop ? loop.GetIndex() : 0 } else return loopStack.GetCurrent().GetIndex() }, savestatejson() { return this._runtime.GetLastSaveJsonString() }, callmapped(name, str, ...paramResults) { const mapEntry = this._GetFunctionMap(name.toLowerCase(), false); if (!mapEntry) { console.warn(`[Construct 3] Call mapped function: map name '${name}' not found; returning 0`); return 0 } let functionBlock = mapEntry.strMap.get(str.toLowerCase()); if (!functionBlock) if (mapEntry.defaultFunc) functionBlock = mapEntry.defaultFunc; else { console.warn(`[Construct 3] Call mapped function: no function associated with map '${name}' string '${str}'; returning 0 (consider setting a default)`); return 0 } const returnType = functionBlock.GetReturnType(); const defaultReturnValue = functionBlock.GetDefaultReturnValue(); if (returnType === 0) { console.warn(`[Construct 3] Call mapped function: map '${name}' string '${str}' has no return type so cannot be called from an expression; returning 0`); return 0 } if (!functionBlock.IsEnabled()) return defaultReturnValue; const runtime = this._runtime; const eventSheetManager = runtime.GetEventSheetManager(); const currentEvent = eventSheetManager.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiersIncludingParents(); const hasAnySolModifiers = solModifiers.length > 0; if (hasAnySolModifiers) eventSheetManager.PushCleanSol(solModifiers); const calleeParameters = functionBlock.GetFunctionParameters(); for (let i = paramResults.length, len = calleeParameters.length; i < len; ++i) paramResults.push(calleeParameters[i].GetInitialValue()); const callEventBlock = functionBlock.GetEventBlock(); const returnValue = callEventBlock.RunAsExpressionFunctionCall(callEventBlock.GetSolModifiersIncludingParents(), returnType, defaultReturnValue, ...paramResults); if (hasAnySolModifiers) eventSheetManager.PopSol(solModifiers); return returnValue }, loadingprogress() { return this._runtime.GetAssetManager().GetLoadProgress() }, imageloadingprogress() { if (this._imagesLoadingTotal === 0) return 1; return this._imagesLoadingComplete / this._imagesLoadingTotal }, renderer() { return "webgl" }, rendererdetail() { return this._runtime.GetWebGLRenderer().GetUnmaskedRenderer() }, imagememoryusage() { let ret = this._runtime.GetWebGLRenderer().GetEstimatedTextureMemoryUsage(); return Math.round(100 * ret / (1024 * 1024)) / 100 }, rgb(r, g, b) { return C3.PackRGB(r, g, b) }, rgbex(r, g, b) { return C3.PackRGBEx(r / 100, g / 100, b / 100) }, rgba(r, g, b, a) { return C3.PackRGBAEx(r / 100, g / 100, b / 100, a / 100) }, rgbex255(r, g, b) { return C3.PackRGBEx(r / 255, g / 255, b / 255) }, rgba255(r, g, b, a) { return C3.PackRGBAEx(r / 255, g / 255, b / 255, a / 255) }, projectname() { return this._runtime.GetProjectName() }, projectversion() { return this._runtime.GetProjectVersion() }, currenteventsheetname() { return this._runtime.GetCurrentEvent().GetEventSheet().GetName() }, currenteventnumber() { return this._runtime.GetCurrentEvent().GetDisplayNumber() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Spritefont2 = class SpriteFontPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Spritefont2.Type = class SpriteFontType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); this._spriteFont = C3.New(self.SpriteFont) } Release() { super.Release() } OnCreate() { this.GetImageInfo().LoadAsset(this._runtime) } LoadTextures(renderer) { return this.GetImageInfo().LoadStaticTexture(renderer, { sampling: this._runtime.GetSampling() }) } ReleaseTextures() { this.GetImageInfo().ReleaseTexture() } GetSpriteFont() { return this._spriteFont } UpdateSettings(characterWidth, characterHeight, characterSet, spacingData) { const imageInfo = this.GetImageInfo(); const sf = this._spriteFont; sf.SetWidth(imageInfo.GetWidth()); sf.SetHeight(imageInfo.GetHeight()); sf.SetCharacterWidth(characterWidth); sf.SetCharacterHeight(characterHeight); sf.SetCharacterSet(characterSet); sf.SetSpacingData(spacingData); sf.UpdateCharacterMap() } } } ;'use strict'; { const C3 = self.C3; const TEXT = 0; const ENABLE_BBCODE = 1; const CHARACTER_WIDTH = 2; const CHARACTER_HEIGHT = 3; const CHARACTER_SET = 4; const SPACING_DATA = 5; const SCALE = 6; const CHARACTER_SPACING = 7; const LINE_HEIGHT = 8; const HORIZONTAL_ALIGNMENT = 9; const VERTICAL_ALIGNMENT = 10; const WRAPPING = 11; const INITIALLY_VISIBLE = 12; const ORIGIN = 13; const HORIZONTAL_ALIGNMENTS = ["left", "center", "right"]; const VERTICAL_ALIGNMENTS = ["top", "center", "bottom"]; const WORD_WRAP = 0; const CHARACTER_WRAP = 1; C3.Plugins.Spritefont2.Instance = class SpriteFontInstance extends C3.SDKWorldInstanceBase { constructor(inst, properties) { super(inst); this._text = ""; this._enableBBcode = true; this._characterWidth = 16; this._characterHeight = 16; this._characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@\u00b0+=*$\u00a3\u20ac<>"; let spacingData = ""; this._characterScale = 1; this._characterSpacing = 0; this._lineHeight = 0; this._horizontalAlign = 0; this._verticalAlign = 0; this._wrapByWord = true; this._spriteFontText = null; this._typewriterStartTime = -1; this._typewriterEndTime = -1; this._typewriterLength = 0; if (properties) { this._text = properties[0]; this._enableBBcode = properties[1]; this._characterWidth = properties[2]; this._characterHeight = properties[3]; this._characterSet = properties[4]; spacingData = properties[5]; this._characterScale = properties[6]; this._characterSpacing = properties[7]; this._lineHeight = properties[8]; this._horizontalAlign = properties[9]; this._verticalAlign = properties[10]; this._wrapByWord = properties[11] === 0; const wi = this.GetWorldInfo(); wi.SetVisible(properties[12]) } this._sdkType.UpdateSettings(this._characterWidth, this._characterHeight, this._characterSet, spacingData); this._spriteFontText = C3.New(self.SpriteFontText, this._sdkType.GetSpriteFont()); const wi = this.GetWorldInfo(); this._spriteFontText.SetSize(wi.GetWidth(), wi.GetHeight()); this._UpdateSettings() } Release() { this._CancelTypewriter(); this._spriteFontText.Release(); this._spriteFontText = null; super.Release() } _UpdateSettings() { const sft = this._spriteFontText; if (!sft) return; sft.SetBBCodeEnabled(this._enableBBcode); sft.SetText(this._text); sft.SetWordWrapMode(this._wrapByWord ? "word" : "character"); sft.SetHorizontalAlign(HORIZONTAL_ALIGNMENTS[this._horizontalAlign]); sft.SetVerticalAlign(VERTICAL_ALIGNMENTS[this._verticalAlign]); sft.SetSpacing(this._characterSpacing); sft.SetLineHeight(this._lineHeight) } Draw(renderer) { const imageInfo = this._objectClass.GetImageInfo(); const texture = imageInfo.GetTexture(); if (!texture) return; renderer.SetTexture(texture); const wi = this.GetWorldInfo(); let q = wi.GetBoundingQuad(); const sft = this._spriteFontText; sft.SetScale(this._characterScale * wi.GetSceneGraphScale()); if (this._runtime.IsPixelRoundingEnabled()) q = wi.PixelRoundQuad(q); sft.SetSize(wi.GetWidth(), wi.GetHeight()); sft.GetSpriteFont().SetTexRect(imageInfo.GetTexRect()); sft.SetColor(wi.GetUnpremultipliedColor()); sft.Draw(renderer, q.getTlx(), q.getTly(), wi.GetAngle()) } SaveToJson() { const ret = { "t": this._text, "ebbc": this._enableBBcode, "csc": this._characterScale, "csp": this._characterSpacing, "lh": this._lineHeight, "ha": this._horizontalAlign, "va": this._verticalAlign, "w": this._wrapByWord, "cw": this._sdkType.GetSpriteFont().GetCharacterWidth(), "ch": this._sdkType.GetSpriteFont().GetCharacterHeight(), "cs": this._sdkType.GetSpriteFont().GetCharacterSet(), "sd": this._sdkType.GetSpriteFont().GetSpacingData() }; if (this._typewriterEndTime !== -1) ret["tw"] = { "st": this._typewriterStartTime, "en": this._typewriterEndTime, "l": this._typewriterLength }; return ret } LoadFromJson(o) { this._CancelTypewriter(); this._text = o["t"]; this._enableBBcode = o["ebbc"]; this._characterScale = o["csc"]; this._characterSpacing = o["csp"]; this._lineHeight = o["lh"]; this._horizontalAlign = o["ha"]; this._verticalAlign = o["va"]; this._wrapByWord = o["w"]; if (o.hasOwnProperty("tw")) { const tw = o["tw"]; this._typewriterStartTime = tw["st"]; this._typewriterEndTime = tw["en"]; this._typewriterLength = o["l"] } const spriteFont = this._sdkType.GetSpriteFont(); spriteFont.SetCharacterWidth(o["cw"]); spriteFont.SetCharacterHeight(o["ch"]); spriteFont.SetCharacterSet(o["cs"]); spriteFont.SetSpacingData(o["sd"]); this._UpdateSettings(); if (this._typewriterEndTime !== -1) this._StartTicking() } GetPropertyValueByIndex(index) { switch (index) { case TEXT: return this._text; case ENABLE_BBCODE: return this._enableBBcode; case CHARACTER_WIDTH: return this._sdkType.GetSpriteFont().GetCharacterWidth(); case CHARACTER_HEIGHT: return this._sdkType.GetSpriteFont().GetCharacterHeight(); case CHARACTER_SET: return this._sdkType.GetSpriteFont().GetCharacterSet(); case SPACING_DATA: return this._sdkType.GetSpriteFont().GetSpacingData(); case SCALE: return this._characterScale; case CHARACTER_SPACING: return this._characterSpacing; case LINE_HEIGHT: return this._lineHeight; case HORIZONTAL_ALIGNMENT: return this._horizontalAlign; case VERTICAL_ALIGNMENT: return this._verticalAlign; case WRAPPING: return this._wrapByWord ? CHARACTER_WRAP : WORD_WRAP } } SetPropertyValueByIndex(index, value) { switch (index) { case TEXT: if (this._text === value) return; this._text = value; this._UpdateSettings(); break; case ENABLE_BBCODE: if (this._enableBBcode === !!value) return; this._enableBBcode = !!value; this._UpdateSettings(); break; case CHARACTER_WIDTH: this._sdkType.GetSpriteFont().SetCharacterWidth(value); break; case CHARACTER_HEIGHT: this._sdkType.GetSpriteFont().SetCharacterHeight(value); break; case CHARACTER_SET: this._sdkType.GetSpriteFont().SetCharacterSet(value); break; case SPACING_DATA: this._sdkType.GetSpriteFont().SetSpacingData(value); break; case SCALE: if (this._characterScale === value) return; this._characterScale = value; this._UpdateSettings(); break; case CHARACTER_SPACING: if (this._characterSpacing === value) return; this._characterSpacing = value; this._UpdateSettings(); break; case LINE_HEIGHT: if (this._lineHeight === value) return; this._lineHeight = value; this._UpdateSettings(); break; case HORIZONTAL_ALIGNMENT: if (this._horizontalAlign === value) return; this._horizontalAlign = value; this._UpdateSettings(); break; case VERTICAL_ALIGNMENT: if (this._verticalAlign === value) return; this._verticalAlign = value; this._UpdateSettings(); break; case WRAPPING: if (this._wrapByWord === (value === WORD_WRAP)) return; this._wrapByWord = value === WORD_WRAP; this._UpdateSettings(); break } } _SetText(text) { if (this._text === text) return; this._text = text; this._spriteFontText.SetText(text); this._runtime.UpdateRender() } GetText() { return this._text } _StartTypewriter(text, duration) { this._SetText(text); this._typewriterStartTime = this._runtime.GetWallTime(); this._typewriterEndTime = this._typewriterStartTime + duration / this.GetInstance().GetActiveTimeScale(); this._typewriterLength = C3.BBString.StripAnyTags(text).length; this._spriteFontText.SetDrawMaxCharacterCount(0); this._StartTicking() } _CancelTypewriter() { this._typewriterStartTime = -1; this._typewriterEndTime = -1; this._typewriterLength = 0; this._spriteFontText.SetDrawMaxCharacterCount(-1); this._StopTicking() } _FinishTypewriter() { if (this._typewriterEndTime === -1) return; this._CancelTypewriter(); this.Trigger(C3.Plugins.Spritefont2.Cnds.OnTypewriterTextFinished); this._runtime.UpdateRender() } _SetScale(s) { if (this._characterScale === s) return; this._characterScale = s; this._spriteFontText.SetScale(this._characterScale); this._runtime.UpdateRender() } _GetScale() { return this._characterScale } _SetCharacterSpacing(s) { if (this._characterSpacing === s) return; this._characterSpacing = s; this._spriteFontText.SetSpacing(this._characterSpacing); this._runtime.UpdateRender() } _GetCharacterSpacing() { return this._characterSpacing } _SetLineHeight(h) { if (this._lineHeight === h) return; this._lineHeight = h; this._spriteFontText.SetLineHeight(this._lineHeight); this._runtime.UpdateRender() } _GetLineHeight() { return this._lineHeight } _SetHAlign(h) { if (this._horizontalAlign === h) return; this._horizontalAlign = h; this._UpdateSettings(); this._runtime.UpdateRender() } _GetHAlign() { return this._horizontalAlign } _SetVAlign(v) { if (this._verticalAlign === v) return; this._verticalAlign = v; this._UpdateSettings(); this._runtime.UpdateRender() } _GetVAlign() { return this._verticalAlign } _SetWrapByWord(w) { w = !!w; if (this._wrapByWord === w) return; this._wrapByWord = w; this._UpdateSettings(); this._runtime.UpdateRender() } _IsWrapByWord() { return this._wrapByWord } Tick() { const wallTime = this._runtime.GetWallTime(); if (wallTime >= this._typewriterEndTime) { this._CancelTypewriter(); this.Trigger(C3.Plugins.Spritefont2.Cnds.OnTypewriterTextFinished); this._runtime.UpdateRender() } else { let displayLength = C3.relerp(this._typewriterStartTime, this._typewriterEndTime, wallTime, 0, this._typewriterLength); displayLength = Math.floor(displayLength); if (displayLength !== this._spriteFontText.GetDrawMaxCharacterCount()) { this._spriteFontText.SetDrawMaxCharacterCount(displayLength); this._runtime.UpdateRender() } } } GetDebuggerProperties() { const prefix = "plugins.spritefont2"; return [{ title: prefix + ".name", properties: [{ name: prefix + ".properties.text.name", value: this._text, onedit: v=>this._SetText(v) }] }] } GetScriptInterfaceClass() { return self.ISpriteFontInstance } } ; const map = new WeakMap; const SCRIPT_HORIZONTAL_ALIGNMENTS = new Map([["left", 0], ["center", 1], ["right", 2]]); const SCRIPT_VERTICAL_ALIGNMENTS = new Map([["top", 0], ["center", 1], ["bottom", 2]]); const SCRIPT_WRAP_MODES = new Map([["word", true], ["character", false]]); self.ISpriteFontInstance = class ISpriteFontInstance extends self.IWorldInstance { constructor() { super(); map.set(this, self.IInstance._GetInitInst().GetSdkInstance()) } get text() { return map.get(this).GetText() } set text(str) { const inst = map.get(this); inst._CancelTypewriter(); inst._SetText(str) } typewriterText(str, duration) { const inst = map.get(this); inst._CancelTypewriter(); inst._StartTypewriter(str, duration) } typewriterFinish() { map.get(this)._FinishTypewriter() } set characterScale(s) { map.get(this)._SetScale(s) } get characterScale() { return map.get(this)._GetScale() } set characterSpacing(s) { map.get(this)._SetCharacterSpacing(s) } get characterSpacing() { return map.get(this)._GetCharacterSpacing() } set lineHeight(lho) { map.get(this)._SetLineHeight(lho) } get lineHeight() { return map.get(this)._GetLineHeight() } set horizontalAlign(str) { const h = SCRIPT_HORIZONTAL_ALIGNMENTS.get(str); if (typeof h === "undefined") throw new Error("invalid mode"); map.get(this)._SetHAlign(h) } get horizontalAlign() { return HORIZONTAL_ALIGNMENTS[map.get(this)._GetHAlign()] } set verticalAlign(str) { const v = SCRIPT_VERTICAL_ALIGNMENTS.get(str); if (typeof v === "undefined") throw new Error("invalid mode"); map.get(this)._SetVAlign(v) } get verticalAlign() { return VERTICAL_ALIGNMENTS[map.get(this)._GetVAlign()] } set wordWrapMode(str) { const isWrapByWord = SCRIPT_WRAP_MODES.get(str); if (typeof isWrapByWord === "undefined") throw new Error("invalid mode"); map.get(this)._SetWrapByWord(isWrapByWord) } get wordWrapMode() { return map.get(this)._IsWrapByWord() ? "word" : "character" } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Spritefont2.Cnds = { CompareText(text, caseSensitive) { if (caseSensitive) return this._text === text; else return C3.equalsNoCase(this._text, text) }, IsRunningTypewriterText() { return this._typewriterEndTime !== -1 }, OnTypewriterTextFinished() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Spritefont2.Acts = { SetText(param) { this._CancelTypewriter(); if (typeof param === "number" && param < 1E9) param = Math.round(param * 1E10) / 1E10; this._SetText(param.toString()) }, AppendText(param) { this._CancelTypewriter(); if (typeof param === "number" && param < 1E9) param = Math.round(param * 1E10) / 1E10; param = param.toString(); if (!param) return; this._SetText(this._text + param) }, TypewriterText(param, duration) { this._CancelTypewriter(); if (typeof param === "number" && param < 1E9) param = Math.round(param * 1E10) / 1E10; this._StartTypewriter(param.toString(), duration) }, TypewriterFinish() { this._FinishTypewriter() }, SetScale(s) { this._SetScale(s) }, SetCharacterSpacing(s) { this._SetCharacterSpacing(s) }, SetLineHeight(h) { this._SetLineHeight(h) }, SetCharacterWidth(chars, width) { let didAnyChange = false; const spriteFont = this._sdkType.GetSpriteFont(); for (const ch of chars) if (ch === " ") { spriteFont.SetSpaceWidth(width); didAnyChange = true } else { const sfc = spriteFont.GetCharacter(ch); if (sfc) { sfc.SetDisplayWidth(width); didAnyChange = true } } if (didAnyChange) spriteFont.SetCharacterWidthsChanged(); this._runtime.UpdateRender() }, SetEffect(effect) { this.GetWorldInfo().SetBlendMode(effect); this._runtime.UpdateRender() }, SetHAlign(h) { this._SetHAlign(h) }, SetVAlign(v) { this._SetVAlign(v) }, SetWrapping(w) { this._SetWrapByWord(w === 0) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Spritefont2.Exps = { CharacterWidth(ch) { const sfc = this._sdkType.GetSpriteFont().GetCharacter(ch); if (sfc) return sfc.GetDisplayWidth(); else return this._sdkType.GetSpriteFont().GetCharacterWidth() }, CharacterHeight() { return this._characterHeight }, CharacterScale() { return this._characterScale }, CharacterSpacing() { return this._characterSpacing }, LineHeight() { return this._lineHeight }, Text() { return this._text }, PlainText() { if (this._enableBBcode) return C3.BBString.StripAnyTags(this._text); else return this._text }, TextWidth() { const wi = this.GetWorldInfo(); this._spriteFontText.SetSize(wi.GetWidth(), wi.GetHeight()); return this._spriteFontText.GetTextWidth() }, TextHeight() { const wi = this.GetWorldInfo(); this._spriteFontText.SetSize(wi.GetWidth(), wi.GetHeight()); return this._spriteFontText.GetTextHeight() } } } ;'use strict'; { const C3 = self.C3; self.SpriteFontCharacter = class SpriteFontCharacter { constructor(spriteFont, char, x, y) { let charWidth = spriteFont.GetCharacterWidth(); let charHeight = spriteFont.GetCharacterHeight(); this._spriteFont = spriteFont; this._char = char; this._pxRect = new C3.Rect(x,y,x + charWidth,y + charHeight); this._texRect = new C3.Rect; this._displayWidth = -1; this._UpdateTexRect() } Release() { this._spriteFont = null; this._pxRect = null; this._texRect = null } _UpdateTexRect() { let w = this._spriteFont.GetWidth(); let h = this._spriteFont.GetHeight(); this._texRect.copy(this._pxRect); this._texRect.divide(w, h); this._texRect.lerpInto(this._spriteFont.GetTexRect()) } GetSpriteFont() { return this._spriteFont } GetChar() { return this._char } GetTexRect() { return this._texRect } SetDisplayWidth(w) { this._displayWidth = w } GetDisplayWidth() { if (this._displayWidth < 0) return this._spriteFont.GetCharacterWidth(); else return this._displayWidth } } } ;'use strict'; { const C3 = self.C3; const tmpRect = new C3.Rect; const tmpQuad = new C3.Quad; const tmpColor = new C3.Color; const VALID_HORIZ_ALIGNMENTS = new Set(["left", "center", "right"]); const VALID_VERT_ALIGNMENTS = new Set(["top", "center", "bottom"]); const VALID_WORD_WRAP_MODES = new Set(["word", "character"]); self.SpriteFontText = class SpriteFontText { constructor(spriteFont) { this._spriteFont = spriteFont; this._cssWidth = 0; this._cssHeight = 0; this._text = ""; this._isBBcodeEnabled = false; this._bbString = null; this._wrappedText = C3.New(C3.WordWrap); this._wrapMode = "word"; this._wrapChanged = false; this._horizontalAlign = "left"; this._verticalAlign = "top"; this._scale = 1; this._spacing = 0; this._lineHeight = 0; this._color = C3.New(C3.Color); this._drawMaxCharCount = -1; this._drawCharCount = 0; this._measureTextCallback = (str,styles)=>this._MeasureText(str, styles); this._spriteFont._AddSpriteFontText(this) } Release() { this._spriteFont._RemoveSpriteFontText(this); this._color = null; this._measureTextCallback = null; this._wrappedText.Clear(); this._wrappedText = null; this._spriteFont = null; this._bbString = null } _MeasureText(str, styles) { const scaleStyle = this._GetStyleTag(styles, "scale"); const scale = scaleStyle ? parseFloat(scaleStyle.param) : this._scale; const scaleXStyle = this._GetStyleTag(styles, "scalex"); const scaleX = (scaleXStyle ? parseFloat(scaleXStyle.param) : 1) * scale; const scaleYStyle = this._GetStyleTag(styles, "scaley"); const scaleY = (scaleYStyle ? parseFloat(scaleYStyle.param) : 1) * scale; const lineTotalHeight = this._spriteFont.GetCharacterHeight() * scaleY + this._lineHeight; const spriteFont = this.GetSpriteFont(); const defaultCharWidth = spriteFont.GetCharacterWidth() * scaleX; const spacing = this.GetSpacing(); if (spriteFont.HasAnyCustomWidths()) { let strLen = 0; let totalWidth = 0; for (const ch of str) { let charWidth = defaultCharWidth; const sfc = spriteFont.GetCharacter(ch); if (sfc) charWidth = sfc.GetDisplayWidth() * scaleX; else if (ch === " ") charWidth = spriteFont.GetSpaceWidth() * scaleX; totalWidth += charWidth; ++strLen } return { width: totalWidth + strLen * spacing, height: lineTotalHeight } } else { const strLen = [...str].length; const spaceCount = Math.max(strLen, 0); return { width: defaultCharWidth * strLen + spaceCount * spacing, height: lineTotalHeight } } } _SetWrapChanged() { this._wrapChanged = true; this._wrappedText.Clear() } SetSize(cssWidth, cssHeight) { if (cssWidth <= 0 || cssHeight <= 0) return; if (this._cssWidth === cssWidth && this._cssHeight === cssHeight) return; if (this._cssWidth !== cssWidth) this._SetWrapChanged(); this._cssWidth = cssWidth; this._cssHeight = cssHeight } SetDrawMaxCharacterCount(n) { this._drawMaxCharCount = Math.floor(n) } GetDrawMaxCharacterCount() { return this._drawMaxCharCount } _GetStyleTag(styles, tag) { for (let i = styles.length - 1; i >= 0; --i) { const s = styles[i]; if (s.tag === tag) return s } return null } _HasStyleTag(styles, tag) { return !!this._GetStyleTag(styles, tag) } _MaybeWrapText() { if (!this._wrapChanged) return; if (this._isBBcodeEnabled && (!this._bbString || this._bbString.toString() !== this._text)) this._bbString = new C3.BBString(this._text,{ noEscape: true }); const endOfLineMargin = -this.GetSpacing(); this._wrappedText.WordWrap(this._isBBcodeEnabled ? this._bbString.toFragmentList() : this._text, this._measureTextCallback, this._cssWidth, this._wrapMode, endOfLineMargin); this._wrapChanged = false } Draw(renderer, offX, offY, angle) { this._MaybeWrapText(); this._drawCharCount = 0; let penY = 0; const lineSpaceHeight = this._lineHeight; const lines = C3.cloneArray(this._wrappedText.GetLines()); const sin_a = Math.sin(angle); const cos_a = Math.cos(angle); const linesTotalHeight = lines.reduce((a,v)=>a + v.height, 0) - lineSpaceHeight; if (this._verticalAlign === "center") penY = Math.max(Math.floor(this._cssHeight / 2 - linesTotalHeight / 2), 0); else if (this._verticalAlign === "bottom") penY = Math.floor(this._cssHeight - linesTotalHeight); for (let i = 0, len = lines.length; i < len; ++i) { const line = lines[i]; const curLineTextHeight = line.height; if (i > 0 && penY > this._cssHeight - (curLineTextHeight - lineSpaceHeight)) break; if (penY >= 0) this._DrawLine(renderer, line, offX, offY, penY, sin_a, cos_a); penY += curLineTextHeight } } _DrawLine(renderer, line, offX, offY, penY, sin_a, cos_a) { const lineHeight = line.height; let penX = 0; if (this._horizontalAlign === "center") penX = Math.max(Math.floor((this._cssWidth - line.width) / 2), 0); else if (this._horizontalAlign === "right") penX = Math.max(Math.floor(this._cssWidth - line.width), 0); for (const frag of line.fragments) { this._DrawFragment(renderer, frag, offX, offY, penX, penY, sin_a, cos_a, lineHeight); penX += frag.width } } _DrawFragment(renderer, frag, offX, offY, penX, penY, sin_a, cos_a, lineHeight) { let text = frag.text; let fragWidth = frag.width; const styles = frag.styles; if (this._drawMaxCharCount !== -1) { if (this._drawCharCount >= this._drawMaxCharCount) return; if (this._drawCharCount + text.length > this._drawMaxCharCount) { text = text.substr(0, this._drawMaxCharCount - this._drawCharCount); fragWidth = this._MeasureText(text, styles).width } this._drawCharCount += text.length } const backgroundStyle = this._GetStyleTag(styles, "background"); if (C3.IsStringAllWhitespace(text) && !backgroundStyle || this._HasStyleTag(styles, "hide")) return; const scaleStyle = this._GetStyleTag(styles, "scale"); const scale = scaleStyle ? parseFloat(scaleStyle.param) : this._scale; const scaleXStyle = this._GetStyleTag(styles, "scalex"); const scaleX = (scaleXStyle ? parseFloat(scaleXStyle.param) : 1) * scale; const scaleYStyle = this._GetStyleTag(styles, "scaley"); const scaleY = (scaleYStyle ? parseFloat(scaleYStyle.param) : 1) * scale; const charHeight = this._spriteFont.GetCharacterHeight() * scaleY; const lineSpaceHeight = this._lineHeight; penY += lineHeight - lineSpaceHeight - charHeight; const offsetXStyle = this._GetStyleTag(styles, "offsetx"); penX += offsetXStyle ? parseFloat(offsetXStyle.param) : 0; const offsetYStyle = this._GetStyleTag(styles, "offsety"); penY += offsetYStyle ? parseFloat(offsetYStyle.param) : 0; if (backgroundStyle) { renderer.SetColorFillMode(); tmpColor.parseString(backgroundStyle.param); tmpColor.setA(1); renderer.SetColor(tmpColor); tmpRect.set(penX, penY, penX + fragWidth, penY + charHeight); if (tmpRect.getRight() > this._cssWidth) tmpRect.setRight(this._cssWidth); tmpQuad.setFromRotatedRectPrecalc(tmpRect, sin_a, cos_a); tmpQuad.offset(offX, offY); renderer.Quad(tmpQuad); renderer.SetTextureFillMode() } const colorStyle = this._GetStyleTag(styles, "color"); if (colorStyle) { tmpColor.parseString(colorStyle.param); tmpColor.setA(this._color.getA()) } else tmpColor.copy(this._color); const opacityStyle = this._GetStyleTag(styles, "opacity"); if (opacityStyle) tmpColor.setA(tmpColor.getA() * parseFloat(opacityStyle.param) / 100); tmpColor.premultiply(); renderer.SetColor(tmpColor); const drawCharWidth = this._spriteFont.GetCharacterWidth() * scaleX; const endOfLineMargin = Math.abs(this.GetSpacing()); for (const ch of text) { const sfc = this._spriteFont.GetCharacter(ch); if (sfc) { const layoutCharWidth = sfc.GetDisplayWidth() * scaleX; if (penX + layoutCharWidth > this._cssWidth + endOfLineMargin + 1E-5) return; tmpRect.set(penX, penY, penX + drawCharWidth, penY + charHeight); tmpQuad.setFromRotatedRectPrecalc(tmpRect, sin_a, cos_a); tmpQuad.offset(offX, offY); renderer.Quad3(tmpQuad, sfc.GetTexRect()); penX += layoutCharWidth + this._spacing } else penX += this._spriteFont.GetSpaceWidth() * scaleX + this._spacing } } GetSpriteFont() { return this._spriteFont } SetBBCodeEnabled(e) { e = !!e; if (this._isBBcodeEnabled === e) return; this._isBBcodeEnabled = e; this._SetWrapChanged() } IsBBCodeEnabled() { return this._isBBcodeEnabled } SetText(text) { if (this._text === text) return; this._text = text; this._SetWrapChanged() } SetWordWrapMode(w) { if (!VALID_WORD_WRAP_MODES.has(w)) throw new Error("invalid word wrap mode"); if (this._wrapMode === w) return; this._wrapMode = w; this._SetWrapChanged() } SetHorizontalAlign(a) { if (!VALID_HORIZ_ALIGNMENTS.has(a)) throw new Error("invalid alignment"); this._horizontalAlign = a } SetVerticalAlign(a) { if (!VALID_VERT_ALIGNMENTS.has(a)) throw new Error("invalid alignment"); this._verticalAlign = a } SetScale(s) { if (this._scale === s) return; this._scale = s; this._SetWrapChanged() } GetScale() { return this._scale } SetSpacing(s) { if (this._spacing === s) return; this._spacing = s; this._SetWrapChanged() } GetSpacing() { return this._spacing } SetLineHeight(h) { this._lineHeight = h; this._SetWrapChanged() } GetLineHeight() { return this._lineHeight } SetOpacity(o) { o = C3.clamp(o, 0, 1); this._color.a = o } SetColor(c) { if (this._color.equals(c)) return; this._color.copy(c) } GetColor() { return this._color } GetTextWidth() { this._MaybeWrapText(); return this._wrappedText.GetMaxLineWidth() } GetTextHeight() { this._MaybeWrapText(); const lineTextHeight = this._spriteFont.GetCharacterHeight() * this._scale; const lineSpaceHeight = this._lineHeight; const lineTotalHeight = lineTextHeight + lineSpaceHeight; return this._wrappedText.GetLineCount() * lineTotalHeight - lineSpaceHeight } } } ;'use strict'; { const C3 = self.C3; const SpriteFontText = self.SpriteFontText; const DEFAULT_SPRITEFONT_OPTS = { width: 256, height: 256, characterWidth: 16, characterHeight: 16, characterSet: "" }; self.SpriteFont = class SpriteFont { constructor(opts) { opts = Object.assign({}, DEFAULT_SPRITEFONT_OPTS, opts); if (opts.width <= 0 || opts.height <= 0 || opts.characterWidth <= 0 || opts.characterHeight <= 0) throw new Error("invalid size"); this._width = opts.width; this._height = opts.height; this._characterWidth = opts.characterWidth; this._characterHeight = opts.characterHeight; this._characterSet = opts.characterSet; this._spacingData = ""; this._spacingParsed = null; this._hasAnyCustomWidths = false; this._spaceWidth = -1; this._texRect = new C3.Rect(0,0,1,1); this._characterMap = new Map; this._mapChanged = true; this._allTexts = new Set } Release() { this._texRect = null; this._ReleaseCharacters(); this._characterMap = null; if (this._allTexts) this._allTexts.clear(); this._allTexts = null } _ReleaseCharacters() { for (let c of this._characterMap.values()) c.Release(); this._characterMap.clear() } _AddSpriteFontText(sft) { this._allTexts.add(sft) } _RemoveSpriteFontText(sft) { this._allTexts.delete(sft) } UpdateCharacterMap() { if (!this._mapChanged) return; this._ReleaseCharacters(); let charSetArr = [...this._characterSet]; let cols = Math.floor(this._width / this._characterWidth); let rows = Math.floor(this._height / this._characterHeight); let last = cols * rows; for (let i = 0, len = charSetArr.length; i < len; ++i) { if (i >= last) break; let x = i % cols; let y = Math.floor(i / cols); let char = charSetArr[i]; this._characterMap.set(char, C3.New(self.SpriteFontCharacter, this, char, x * this._characterWidth, y * this._characterHeight)) } this._hasAnyCustomWidths = false; this._spaceWidth = -1; if (Array.isArray(this._spacingParsed)) for (let entry of this._spacingParsed) { if (!Array.isArray(entry)) continue; if (entry.length !== 2) continue; let charWidth = entry[0]; let str = entry[1]; if (typeof charWidth !== "number" || !isFinite(charWidth) || typeof str !== "string") continue; if (charWidth === this._characterWidth) continue; for (let ch of str) { let sfc = this._characterMap.get(ch); if (sfc) { sfc.SetDisplayWidth(charWidth); this._hasAnyCustomWidths = true } else if (ch === " ") { this._spaceWidth = charWidth; this._hasAnyCustomWidths = true } } } this._mapChanged = false; for (let sft of this._allTexts) sft._SetWrapChanged() } SetCharacterWidthsChanged() { this._hasAnyCustomWidths = true; for (const sft of this._allTexts) sft._SetWrapChanged() } GetCharacter(ch) { this.UpdateCharacterMap(); return this._characterMap.get(ch) || null } HasAnyCustomWidths() { return this._hasAnyCustomWidths } SetWidth(w) { w = Math.floor(w); if (w <= 0) throw new Error("invalid size"); if (this._width === w) return; this._width = w; this._mapChanged = true } GetWidth() { return this._width } SetHeight(h) { h = Math.floor(h); if (h <= 0) throw new Error("invalid size"); if (this._height === h) return; this._height = h; this._mapChanged = true } GetHeight() { return this._height } SetTexRect(rc) { if (this._texRect.equals(rc)) return; this._texRect.copy(rc); for (const sfc of this._characterMap.values()) sfc._UpdateTexRect() } GetTexRect() { return this._texRect } SetCharacterWidth(w) { w = Math.floor(w); if (w <= 0) throw new Error("invalid size"); if (this._characterWidth === w) return; this._characterWidth = w; this._mapChanged = true } GetCharacterWidth() { return this._characterWidth } SetCharacterHeight(h) { h = Math.floor(h); if (h <= 0) throw new Error("invalid size"); if (this._characterHeight === h) return; this._characterHeight = h; this._mapChanged = true } GetCharacterHeight() { return this._characterHeight } SetCharacterSet(s) { if (this._characterSet === s) return; this._characterSet = s; this._mapChanged = true } GetCharacterSet() { return this._characterSet } SetSpacingData(s) { if (this._spacingData === s) return; this._spacingData = s; this._mapChanged = true; this._spacingParsed = null; if (this._spacingData.length) try { this._spacingParsed = JSON.parse(this._spacingData) } catch (e) { this._spacingParsed = null } } GetSpacingData() { return this._spacingData } SetSpaceWidth(w) { if (w < 0) w = -1; if (this._spaceWidth === w) return; this._spaceWidth = w; if (this._spaceWidth >= 0) this._hasAnyCustomWidths = true } GetSpaceWidth() { if (this._spaceWidth < 0) return this._characterWidth; else return this._spaceWidth } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Sprite = class SpritePlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Sprite.Type = class SpriteType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); this._animations = objectClass.GetAnimations() } Release() { C3.clearArray(this._animations); super.Release() } OnCreate() { for (const a of this._animations) a.LoadAllAssets(this._runtime) } LoadTextures(renderer) { const opts = { sampling: this._runtime.GetSampling() }; return Promise.all(this._animations.map(a=>a.LoadAllTextures(renderer, opts))) } ReleaseTextures() { for (const a of this._animations) a.ReleaseAllTextures() } OnDynamicTextureLoadComplete() { this._UpdateAllCurrentTexture() } _UpdateAllCurrentTexture() { for (const inst of this._objectClass.instancesIncludingPendingCreate()) inst.GetSdkInstance()._UpdateCurrentTexture() } FinishCondition(doPick) { C3.Plugins.Sprite._FinishCondition(this, doPick) } } } ;'use strict'; { const C3 = self.C3; const INITIALLY_VISIBLE = 0; const INITIAL_ANIMATION = 1; const INITIAL_FRAME = 2; const ENABLE_COLLISIONS = 3; const tempRect = C3.New(C3.Rect); const tempQuad = C3.New(C3.Quad); const tempVec2 = C3.New(C3.Vector2); const FLAG_PLAYING_FORWARDS = 1 << 0; const FLAG_ANIMATION_PLAYING = 1 << 1; const FLAG_ANIMATION_TRIGGER = 1 << 2; C3.Plugins.Sprite.Instance = class SpriteInstance extends C3.SDKWorldInstanceBase { constructor(inst, properties) { super(inst); let initiallyVisible = true; let initialAnimation = ""; let initialFrame = 0; let collisionEnabled = true; if (properties) { initiallyVisible = !!properties[INITIALLY_VISIBLE]; initialAnimation = properties[INITIAL_ANIMATION]; initialFrame = properties[INITIAL_FRAME]; collisionEnabled = properties[ENABLE_COLLISIONS] } this._currentAnimation = this._objectClass.GetAnimationByName(initialAnimation) || this._objectClass.GetAnimations()[0]; this._currentFrameIndex = C3.clamp(initialFrame, 0, this._currentAnimation.GetFrameCount() - 1); this._currentAnimationFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex); const initialImageInfo = this._currentAnimationFrame.GetImageInfo(); this._currentTexture = initialImageInfo.GetTexture(); this._currentRcTex = initialImageInfo.GetTexRect(); this.HandleWebGLContextLoss(); inst.SetFlag(FLAG_ANIMATION_PLAYING, true); inst.SetFlag(FLAG_PLAYING_FORWARDS, this._currentAnimation.GetSpeed() >= 0); this._currentAnimationSpeed = Math.abs(this._currentAnimation.GetSpeed()); this._currentAnimationRepeatTo = this._currentAnimation.GetRepeatTo(); this._animationTimer = C3.New(C3.KahanSum); this._frameStartTime = 0; this._animationRepeats = 0; this._animTriggerName = ""; this._changeAnimFrameIndex = -1; this._changeAnimationName = ""; this._changeAnimationFrom = 0; const wi = this.GetWorldInfo(); this._bquadRef = wi.GetBoundingQuad(); wi.SetVisible(initiallyVisible); wi.SetCollisionEnabled(collisionEnabled); wi.SetOriginX(this._currentAnimationFrame.GetOriginX()); wi.SetOriginY(this._currentAnimationFrame.GetOriginY()); wi.SetSourceCollisionPoly(this._currentAnimationFrame.GetCollisionPoly()); wi.SetBboxChanged(); if ((this._objectClass.GetAnimationCount() !== 1 || this._objectClass.GetAnimations()[0].GetFrameCount() !== 1) && this._currentAnimationSpeed !== 0) this._StartTicking() } Release() { this._currentAnimation = null; this._currentAnimationFrame = null; this._currentTexture = null; this._animationTimer = null; super.Release() } GetCurrentImageInfo() { return this._currentAnimationFrame.GetImageInfo() } OnWebGLContextLost() { this._currentTexture = null } OnWebGLContextRestored() { this._UpdateCurrentTexture() } Draw(renderer) { const texture = this._currentTexture; if (texture === null) return; renderer.SetTexture(texture); const wi = this.GetWorldInfo(); if (wi.HasMesh()) this._DrawMesh(wi, renderer); else this._DrawStandard(wi, renderer) } _DrawStandard(wi, renderer) { let quad = this._bquadRef; if (this._runtime.IsPixelRoundingEnabled()) quad = wi.PixelRoundQuad(quad); renderer.Quad3(quad, this._currentRcTex) } _DrawMesh(wi, renderer) { const transformedMesh = wi.GetTransformedMesh(); if (wi.IsMeshChanged()) { wi.CalculateBbox(tempRect, tempQuad, false); let quad = tempQuad; if (this._runtime.IsPixelRoundingEnabled()) quad = wi.PixelRoundQuad(quad); transformedMesh.CalculateTransformedMesh(wi.GetSourceMesh(), quad, this._currentRcTex); wi.SetMeshChanged(false) } transformedMesh.Draw(renderer) } GetAnimationTime() { return this._animationTimer.Get() } IsAnimationPlaying() { return this._inst.GetFlag(FLAG_ANIMATION_PLAYING) } SetAnimationPlaying(e) { this._inst.SetFlag(FLAG_ANIMATION_PLAYING, e) } IsPlayingForwards() { return this._inst.GetFlag(FLAG_PLAYING_FORWARDS) } SetPlayingForwards(e) { this._inst.SetFlag(FLAG_PLAYING_FORWARDS, e) } IsInAnimationTrigger() { return this._inst.GetFlag(FLAG_ANIMATION_TRIGGER) } SetInAnimationTrigger(e) { this._inst.SetFlag(FLAG_ANIMATION_TRIGGER, e) } Tick() { if (this._changeAnimationName) this._DoChangeAnimation(); if (this._changeAnimFrameIndex >= 0) this._DoChangeAnimFrame(); const currentAnimationSpeed = this._currentAnimationSpeed; if (!this.IsAnimationPlaying() || currentAnimationSpeed === 0) { this._StopTicking(); return } const dt = this._runtime.GetDt(this._inst); this._animationTimer.Add(dt); const now = this.GetAnimationTime(); const prevFrame = this._currentAnimationFrame; const currentFrameTime = prevFrame.GetDuration() / currentAnimationSpeed; if (now < this._frameStartTime + currentFrameTime) return; const currentAnimation = this._currentAnimation; const repeatTo = this._currentAnimationRepeatTo; const frameCount = currentAnimation.GetFrameCount(); const repeatCount = currentAnimation.GetRepeatCount(); const isLooping = currentAnimation.IsLooping(); const isPingPong = currentAnimation.IsPingPong(); if (this.IsPlayingForwards()) this._currentFrameIndex++; else this._currentFrameIndex--; this._frameStartTime += currentFrameTime; if (this._currentFrameIndex >= frameCount) if (isPingPong) { this.SetPlayingForwards(false); this._currentFrameIndex = frameCount - 2 } else if (isLooping) this._currentFrameIndex = repeatTo; else { this._animationRepeats++; if (this._animationRepeats >= repeatCount) this._FinishAnimation(false); else this._currentFrameIndex = repeatTo } if (this._currentFrameIndex < 0) if (isPingPong) { this._currentFrameIndex = 1; this.SetPlayingForwards(true); if (!isLooping) { this._animationRepeats++; if (this._animationRepeats >= repeatCount) this._FinishAnimation(true) } } else if (isLooping) this._currentFrameIndex = repeatTo; else { this._animationRepeats++; if (this._animationRepeats >= repeatCount) this._FinishAnimation(true); else this._currentFrameIndex = repeatTo } this._currentFrameIndex = C3.clamp(this._currentFrameIndex, 0, frameCount - 1); const nextFrame = currentAnimation.GetFrameAt(this._currentFrameIndex); if (now > this._frameStartTime + nextFrame.GetDuration() / currentAnimationSpeed) this._frameStartTime = now; this._OnFrameChanged(prevFrame, nextFrame) } _FinishAnimation(reverse) { this._currentFrameIndex = reverse ? 0 : this._currentAnimation.GetFrameCount() - 1; this.SetAnimationPlaying(false); this._animTriggerName = this._currentAnimation.GetName(); this.SetInAnimationTrigger(true); this.Trigger(C3.Plugins.Sprite.Cnds.OnAnyAnimFinished); this.Trigger(C3.Plugins.Sprite.Cnds.OnAnimFinished); this.SetInAnimationTrigger(false); this._animationRepeats = 0 } _OnFrameChanged(prevFrame, nextFrame) { if (prevFrame === nextFrame) return; const wi = this.GetWorldInfo(); const prevImage = prevFrame.GetImageInfo(); const nextImage = nextFrame.GetImageInfo(); const oldW = prevImage.GetWidth(); const oldH = prevImage.GetHeight(); const newW = nextImage.GetWidth(); const newH = nextImage.GetHeight(); if (oldW !== newW) wi.SetWidth(wi.GetWidth() * (newW / oldW)); if (oldH !== newH) wi.SetHeight(wi.GetHeight() * (newH / oldH)); wi.SetOriginX(nextFrame.GetOriginX()); wi.SetOriginY(nextFrame.GetOriginY()); wi.SetSourceCollisionPoly(nextFrame.GetCollisionPoly()); wi.SetBboxChanged(); this._currentAnimationFrame = nextFrame; this._currentTexture = nextImage.GetTexture(); this._currentRcTex = nextImage.GetTexRect(); const behaviorInstances = this.GetInstance().GetBehaviorInstances(); for (let i = 0, len = behaviorInstances.length; i < len; ++i) behaviorInstances[i].OnSpriteFrameChanged(prevFrame, nextFrame); this.Trigger(C3.Plugins.Sprite.Cnds.OnFrameChanged); this._runtime.UpdateRender() } _StartAnim(from) { this.SetAnimationPlaying(true); this._frameStartTime = this.GetAnimationTime(); if (from === 1 && this._currentFrameIndex !== 0) { this._changeAnimFrameIndex = 0; if (!this.IsInAnimationTrigger()) this._DoChangeAnimFrame() } this._StartTicking() } _SetAnim(animName, from) { this._changeAnimationName = animName; this._changeAnimationFrom = from; this._StartTicking(); if (!this.IsInAnimationTrigger()) this._DoChangeAnimation() } _GetCurrentAnimationName() { if (this._changeAnimationName) return this._changeAnimationName; else return this._currentAnimation.GetName() } _SetAnimFrame(frameNum) { if (!isFinite(frameNum)) return; this._changeAnimFrameIndex = frameNum; if (!this.IsInAnimationTrigger()) this._DoChangeAnimFrame() } _GetAnimFrame() { return this._currentFrameIndex } _SetAnimSpeed(s) { this._currentAnimationSpeed = Math.abs(s); this.SetPlayingForwards(s >= 0); if (this._currentAnimationSpeed > 0) this._StartTicking() } _GetAnimSpeed() { return this.IsPlayingForwards() ? this._currentAnimationSpeed : -this._currentAnimationSpeed } _SetAnimRepeatToFrame(f) { f = C3.clamp(Math.floor(f), 0, this._currentAnimation.GetFrameCount() - 1); this._currentAnimationRepeatTo = f } _GetAnimRepeatToFrame() { return this._currentAnimationRepeatTo } _DoChangeAnimation() { const prevFrame = this._currentAnimationFrame; const animation = this._objectClass.GetAnimationByName(this._changeAnimationName); this._changeAnimationName = ""; if (!animation) return; if (animation === this._currentAnimation && this.IsAnimationPlaying()) return; this._currentAnimation = animation; this.SetPlayingForwards(animation.GetSpeed() >= 0); this._currentAnimationSpeed = Math.abs(animation.GetSpeed()); this._currentAnimationRepeatTo = animation.GetRepeatTo(); this._currentFrameIndex = C3.clamp(this._currentFrameIndex, 0, this._currentAnimation.GetFrameCount() - 1); if (this._changeAnimationFrom === 1) this._currentFrameIndex = 0; this.SetAnimationPlaying(true); this._frameStartTime = this.GetAnimationTime(); const nextFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex); this._OnFrameChanged(prevFrame, nextFrame) } _DoChangeAnimFrame() { const prevFrame = this._currentAnimationFrame; const prevFrameIndex = this._currentFrameIndex; this._currentFrameIndex = C3.clamp(Math.floor(this._changeAnimFrameIndex), 0, this._currentAnimation.GetFrameCount() - 1); this._changeAnimFrameIndex = -1; if (prevFrameIndex === this._currentFrameIndex) return; const nextFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex); this._OnFrameChanged(prevFrame, nextFrame); this._frameStartTime = this.GetAnimationTime() } _UpdateCurrentTexture() { const curImageInfo = this._currentAnimationFrame.GetImageInfo(); this._currentTexture = curImageInfo.GetTexture(); this._currentRcTex = curImageInfo.GetTexRect(); this.GetWorldInfo().SetMeshChanged(true) } GetImagePointCount() { return this._currentAnimationFrame.GetImagePointCount() } GetImagePoint(nameOrIndex) { const frame = this._currentAnimationFrame; const wi = this.GetWorldInfo(); let ip = null; if (typeof nameOrIndex === "string") ip = frame.GetImagePointByName(nameOrIndex); else if (typeof nameOrIndex === "number") ip = frame.GetImagePointByIndex(nameOrIndex - 1); else throw new TypeError("expected string or number"); if (!ip) return [wi.GetX(), wi.GetY()]; tempVec2.copy(ip.GetVec2()); if (wi.HasMesh()) { const [tx,ty] = wi.GetSourceMesh().TransformPoint(tempVec2.getX(), tempVec2.getY()); tempVec2.set(tx, ty) } tempVec2.offset(-frame.GetOriginX(), -frame.GetOriginY()); tempVec2.scale(wi.GetWidth(), wi.GetHeight()); tempVec2.rotate(wi.GetAngle()); tempVec2.offset(wi.GetX(), wi.GetY()); return [tempVec2.getX(), tempVec2.getY()] } GetCollisionPolyPointCount() { return this.GetWorldInfo().GetTransformedCollisionPoly().pointCount() } GetCollisionPolyPoint(index) { index = Math.floor(index); const wi = this.GetWorldInfo(); const poly = wi.GetTransformedCollisionPoly(); const pointCount = poly.pointCount(); if (index === pointCount) index = 0; if (index < 0 || index >= pointCount) return [0, 0]; const pointsArr = poly.pointsArr(); return [pointsArr[index * 2 + 0] + wi.GetX(), pointsArr[index * 2 + 1] + wi.GetY()] } GetDebuggerProperties() { const Acts = C3.Plugins.Sprite.Acts; const prefix = "plugins.sprite.debugger.animation-properties"; return [{ title: prefix + ".title", properties: [{ name: prefix + ".current-animation", value: this._currentAnimation.GetName(), onedit: v=>this.CallAction(Acts.SetAnim, v, 0) }, { name: prefix + ".current-frame", value: this._currentFrameIndex, onedit: v=>this.CallAction(Acts.SetAnimFrame, v) }, { name: prefix + ".is-playing", value: this.IsAnimationPlaying(), onedit: v=>v ? this.CallAction(Acts.StartAnim, 0) : this.CallAction(Acts.StopAnim) }, { name: prefix + ".speed", value: this._currentAnimationSpeed, onedit: v=>this.CallAction(Acts.SetAnimSpeed, v) }, { name: prefix + ".repeats", value: this._animationRepeats, onedit: v=>this._animationRepeats = v }] }] } SaveToJson() { const o = { "a": this._currentAnimation.GetSID() }; if (this._frameStartTime !== 0) o["fs"] = this._frameStartTime; const animTime = this.GetAnimationTime(); if (animTime !== 0) o["at"] = animTime; if (this._currentFrameIndex !== 0) o["f"] = this._currentFrameIndex; if (this._currentAnimationSpeed !== 0) o["cas"] = this._currentAnimationSpeed; if (this._animationRepeats !== 1) o["ar"] = this._animationRepeats; if (this._currentAnimationRepeatTo !== 0) o["rt"] = this._currentAnimationRepeatTo; if (!this.IsAnimationPlaying()) o["ap"] = this.IsAnimationPlaying(); if (!this.IsPlayingForwards()) o["af"] = this.IsPlayingForwards(); const wi = this.GetWorldInfo(); if (wi.IsCollisionEnabled()) o["ce"] = wi.IsCollisionEnabled(); return o } LoadFromJson(o) { const anim = this.GetObjectClass().GetAnimationBySID(o["a"]); if (anim) this._currentAnimation = anim; this._frameStartTime = o.hasOwnProperty("fs") ? o["fs"] : 0; this._animationTimer.Set(o.hasOwnProperty("at") ? o["at"] : 0); const frameIndex = o.hasOwnProperty("f") ? o["f"] : 0; this._currentFrameIndex = C3.clamp(frameIndex, 0, this._currentAnimation.GetFrameCount() - 1); this._currentAnimationSpeed = o.hasOwnProperty("cas") ? o["cas"] : 0; this._animationRepeats = o.hasOwnProperty("ar") ? o["ar"] : 1; const repeatToIndex = o.hasOwnProperty("rt") ? o["rt"] : 0; this._currentAnimationRepeatTo = C3.clamp(repeatToIndex, 0, this._currentAnimation.GetFrameCount() - 1); this.SetAnimationPlaying(o.hasOwnProperty("ap") ? !!o["ap"] : true); this.SetPlayingForwards(o.hasOwnProperty("af") ? !!o["af"] : true); const nextFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex); this._currentAnimationFrame = nextFrame; this._UpdateCurrentTexture(); const wi = this.GetWorldInfo(); wi.SetOriginX(nextFrame.GetOriginX()); wi.SetOriginY(nextFrame.GetOriginY()); wi.SetSourceCollisionPoly(nextFrame.GetCollisionPoly()); wi.SetCollisionEnabled(!!o["ce"]) } GetPropertyValueByIndex(index) { const wi = this.GetWorldInfo(); switch (index) { case ENABLE_COLLISIONS: return wi.IsCollisionEnabled(); case INITIAL_FRAME: return C3.clamp(this._currentFrameIndex, 0, this._currentAnimation.GetFrameCount() - 1) } } SetPropertyValueByIndex(index, value) { const wi = this.GetWorldInfo(); switch (index) { case ENABLE_COLLISIONS: wi.SetCollisionEnabled(!!value); break; case INITIAL_FRAME: this.SetAnimationPlaying(false); const totalFrames = this._currentAnimation.GetFrameCount() - 1; const nextIndex = value = C3.clamp(value, 0, totalFrames); const prevFrame = this._currentAnimation.GetFrameAt(this._currentFrameIndex); const nextFrame = this._currentAnimation.GetFrameAt(nextIndex); this._OnFrameChanged(prevFrame, nextFrame); this._currentFrameIndex = C3.clamp(nextIndex, 0, totalFrames); break } } GetScriptInterfaceClass() { return self.ISpriteInstance } } ; const map = new WeakMap; const ANIM_FROM_MODES = new Map([["current-frame", 0], ["beginning", 1]]); self.ISpriteInstance = class ISpriteInstance extends self.IWorldInstance { constructor() { super(); map.set(this, self.IInstance._GetInitInst().GetSdkInstance()) } getImagePointCount() { return map.get(this).GetImagePointCount() } getImagePointX(nameOrIndex) { if (typeof nameOrIndex !== "string" && typeof nameOrIndex !== "number") throw new TypeError("expected string or number"); return map.get(this).GetImagePoint(nameOrIndex)[0] } getImagePointY(nameOrIndex) { if (typeof nameOrIndex !== "string" && typeof nameOrIndex !== "number") throw new TypeError("expected string or number"); return map.get(this).GetImagePoint(nameOrIndex)[1] } getImagePoint(nameOrIndex) { if (typeof nameOrIndex !== "string" && typeof nameOrIndex !== "number") throw new TypeError("expected string or number"); return map.get(this).GetImagePoint(nameOrIndex) } getPolyPointCount() { return map.get(this).GetCollisionPolyPointCount() } getPolyPointX(index) { return map.get(this).GetCollisionPolyPoint(index)[0] } getPolyPointY(index) { return map.get(this).GetCollisionPolyPoint(index)[1] } getPolyPoint(index) { return map.get(this).GetCollisionPolyPoint(index) } stopAnimation() { map.get(this).SetAnimationPlaying(false) } startAnimation(from="current-frame") { const f = ANIM_FROM_MODES.get(from); if (typeof f === "undefined") throw new Error("invalid mode"); map.get(this)._StartAnim(f) } setAnimation(name, from="beginning") { const f = ANIM_FROM_MODES.get(from); if (typeof f === "undefined") throw new Error("invalid mode"); map.get(this)._SetAnim(name, f) } get animationName() { return map.get(this)._GetCurrentAnimationName() } set animationFrame(frameIndex) { map.get(this)._SetAnimFrame(frameIndex) } get animationFrame() { return map.get(this)._GetAnimFrame() } set animationSpeed(s) { map.get(this)._SetAnimSpeed(s) } get animationSpeed() { return map.get(this)._GetAnimSpeed() } set animationRepeatToFrame(f) { map.get(this)._SetAnimRepeatToFrame(f) } get animationRepeatToFrame() { return map.get(this)._GetAnimRepeatToFrame() } get imageWidth() { return map.get(this).GetCurrentImageInfo().GetWidth() } get imageHeight() { return map.get(this).GetCurrentImageInfo().GetHeight() } } } ;'use strict'; { const C3 = self.C3; const tempRect = C3.New(C3.Rect); const tempCandidates1 = []; const tempCandidates2 = []; let needsCollisionFinish = false; let rPickType = null; let rPickFromElseInstances = false; const rToPick = new Set; function CollMemory_Add(collMemory, a, b, tickCount) { const a_uid = a.GetUID(); const b_uid = b.GetUID(); if (a_uid < b_uid) collMemory.Set(a, b, tickCount); else collMemory.Set(b, a, tickCount) } function CollMemory_Remove(collMemory, a, b) { const a_uid = a.GetUID(); const b_uid = b.GetUID(); if (a_uid < b_uid) collMemory.Delete(a, b); else collMemory.Delete(b, a) } function CollMemory_RemoveInstance(collMemory, inst) { collMemory.DeleteEither(inst) } function CollMemory_Get(collMemory, a, b) { const a_uid = a.GetUID(); const b_uid = b.GetUID(); if (a_uid < b_uid) return collMemory.Get(a, b); else return collMemory.Get(b, a) } function DoOverlapCondition(sdkInst, rtype, offX, offY) { if (!rtype) return false; const inst = sdkInst.GetInstance(); const hasOffset = offX !== 0 || offY !== 0; const wi = inst.GetWorldInfo(); const runtime = inst.GetRuntime(); const collisionEngine = runtime.GetCollisionEngine(); const cnd = runtime.GetCurrentCondition(); const isOrBlock = cnd.GetEventBlock().IsOrBlock(); const ltype = cnd.GetObjectClass(); const isInverted = cnd.IsInverted(); const rsol = rtype.GetCurrentSol(); const isDifferentTypes = ltype !== rtype; rPickType = rtype; needsCollisionFinish = isDifferentTypes && !isInverted; rPickFromElseInstances = false; let rinstances; let oldX = 0; let oldY = 0; let ret = false; if (rsol.IsSelectAll()) { tempRect.copy(wi.GetBoundingBox()); tempRect.offset(offX, offY); collisionEngine.GetCollisionCandidates(wi.GetLayer(), rtype, tempRect, tempCandidates2); rinstances = tempCandidates2 } else if (isOrBlock) if (runtime.IsCurrentConditionFirst() && !rsol._GetOwnElseInstances().length && rsol._GetOwnInstances().length) rinstances = rsol._GetOwnInstances(); else { rinstances = rsol._GetOwnElseInstances(); rPickFromElseInstances = true } else rinstances = rsol._GetOwnInstances(); if (hasOffset) { oldX = wi.GetX(); oldY = wi.GetY(); wi.OffsetXY(offX, offY); wi.SetBboxChanged() } for (const rinst of rinstances) if (collisionEngine.TestOverlap(inst, rinst)) { ret = true; if (isInverted) break; if (isDifferentTypes) rToPick.add(rinst) } if (hasOffset) { wi.SetXY(oldX, oldY); wi.SetBboxChanged() } C3.clearArray(tempCandidates2); return ret } function FinishCollisionConditionPicking(type) { const isOrBlock = type.GetRuntime().GetCurrentEvent().IsOrBlock(); const sol = rPickType.GetCurrentSol(); const solInstances = sol._GetOwnInstances(); const solElseInstances = sol._GetOwnElseInstances(); if (sol.IsSelectAll()) { sol.SetSetPicked(rToPick); if (isOrBlock) { C3.clearArray(solElseInstances); sol.AddElseInstances(rToPick, rPickType.GetInstances()) } } else if (isOrBlock) if (rPickFromElseInstances) sol.TransferElseInstancesToOwn(rToPick); else { sol.AddElseInstances(rToPick, solInstances); sol.SetSetPicked(rToPick) } else sol.SetSetPicked(rToPick); rPickType.ApplySolToContainer() } C3.Plugins.Sprite._FinishCondition = function(type, doPick) { if (!needsCollisionFinish) return; if (doPick) FinishCollisionConditionPicking(type); rToPick.clear(); rPickType = null; needsCollisionFinish = false } ; C3.Plugins.Sprite.Cnds = { OnCollision(rtype) { if (this._runtime.IsDebugging()) return C3.Plugins.Sprite.Cnds.DebugOnCollision.call(this, rtype); if (!rtype) return false; const runtime = this._runtime; const collisionEngine = runtime.GetCollisionEngine(); const eventSheetManager = runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const cnd = eventSheetManager.GetCurrentCondition(); const ltype = cnd.GetObjectClass(); const savedData = cnd.GetSavedDataMap(); const unsavedData = cnd.GetUnsavedDataMap(); const oldFrame = eventStack.GetCurrentStackFrame(); const tickCount = runtime.GetTickCount(); const lastTickCount = tickCount - 1; const currentEvent = oldFrame.GetCurrentEvent(); const newFrame = eventStack.Push(currentEvent); let collMemory = savedData.get("collmemory"); if (!collMemory) { collMemory = C3.New(C3.PairMap); savedData.set("collmemory", collMemory) } if (!unsavedData.get("spriteCreatedDestroyCallback")) { unsavedData.set("spriteCreatedDestroyCallback", true); runtime.Dispatcher().addEventListener("instancedestroy", e=>CollMemory_RemoveInstance(collMemory, e.instance)) } const lsol = ltype.GetCurrentSol(); const rsol = rtype.GetCurrentSol(); const linstances = lsol.GetInstances(); let rinstances = null; for (let l = 0; l < linstances.length; ++l) { const linst = linstances[l]; if (rsol.IsSelectAll()) { collisionEngine.GetCollisionCandidates(linst.GetWorldInfo().GetLayer(), rtype, linst.GetWorldInfo().GetBoundingBox(), tempCandidates1); rinstances = tempCandidates1; collisionEngine.AddRegisteredCollisionCandidates(linst, rtype, rinstances) } else rinstances = rsol.GetInstances(); for (let r = 0; r < rinstances.length; ++r) { const rinst = rinstances[r]; if (collisionEngine.TestOverlap(linst, rinst) || collisionEngine.CheckRegisteredCollision(linst, rinst)) { const entry = CollMemory_Get(collMemory, linst, rinst); let entryExists = false; let lastCollTickCount = -2; if (typeof entry === "number") { entryExists = true; lastCollTickCount = entry } const shouldRun = !entryExists || lastCollTickCount < lastTickCount; CollMemory_Add(collMemory, linst, rinst, tickCount); if (shouldRun) { const solModifiers = currentEvent.GetSolModifiers(); eventSheetManager.PushCopySol(solModifiers); const curlsol = ltype.GetCurrentSol(); const currsol = rtype.GetCurrentSol(); curlsol._SetSelectAll(false); currsol._SetSelectAll(false); if (ltype === rtype) { const solInstances = curlsol._GetOwnInstances(); C3.clearArray(solInstances); solInstances.push(linst); solInstances.push(rinst); ltype.ApplySolToContainer() } else { const lsolInstances = curlsol._GetOwnInstances(); const rsolInstances = currsol._GetOwnInstances(); C3.clearArray(lsolInstances); C3.clearArray(rsolInstances); lsolInstances.push(linst); rsolInstances.push(rinst); ltype.ApplySolToContainer(); rtype.ApplySolToContainer() } currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } } else CollMemory_Remove(collMemory, linst, rinst) } C3.clearArray(tempCandidates1) } eventStack.Pop(); return false }, *DebugOnCollision(rtype) { if (!rtype) return false; const runtime = this._runtime; const collisionEngine = runtime.GetCollisionEngine(); const eventSheetManager = runtime.GetEventSheetManager(); const eventStack = eventSheetManager.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const tickCount = runtime.GetTickCount(); const lastTickCount = tickCount - 1; const currentEvent = oldFrame.GetCurrentEvent(); const newFrame = eventStack.Push(currentEvent); const cnd = eventSheetManager.GetCurrentCondition(); const ltype = cnd.GetObjectClass(); const savedData = cnd.GetSavedDataMap(); const unsavedData = cnd.GetUnsavedDataMap(); let collMemory = savedData.get("collmemory"); if (!collMemory) { collMemory = C3.New(C3.PairMap); savedData.set("collmemory", collMemory) } if (!unsavedData.get("spriteCreatedDestroyCallback")) { unsavedData.set("spriteCreatedDestroyCallback", true); runtime.Dispatcher().addEventListener("instancedestroy", e=>CollMemory_RemoveInstance(collMemory, e.instance)) } const lsol = ltype.GetCurrentSol(); const rsol = rtype.GetCurrentSol(); const linstances = lsol.GetInstances(); let rinstances = null; for (let l = 0; l < linstances.length; ++l) { const linst = linstances[l]; if (rsol.IsSelectAll()) { collisionEngine.GetCollisionCandidates(linst.GetWorldInfo().GetLayer(), rtype, linst.GetWorldInfo().GetBoundingBox(), tempCandidates1); rinstances = tempCandidates1; collisionEngine.AddRegisteredCollisionCandidates(linst, rtype, rinstances) } else rinstances = rsol.GetInstances(); for (let r = 0; r < rinstances.length; ++r) { const rinst = rinstances[r]; if (collisionEngine.TestOverlap(linst, rinst) || collisionEngine.CheckRegisteredCollision(linst, rinst)) { const entry = CollMemory_Get(collMemory, linst, rinst); let entryExists = false; let lastCollTickCount = -2; if (typeof entry === "number") { entryExists = true; lastCollTickCount = entry } const shouldRun = !entryExists || lastCollTickCount < lastTickCount; CollMemory_Add(collMemory, linst, rinst, tickCount); if (shouldRun) { const solModifiers = currentEvent.GetSolModifiers(); eventSheetManager.PushCopySol(solModifiers); const curlsol = ltype.GetCurrentSol(); const currsol = rtype.GetCurrentSol(); curlsol._SetSelectAll(false); currsol._SetSelectAll(false); if (ltype === rtype) { const solInstances = curlsol._GetOwnInstances(); C3.clearArray(solInstances); solInstances.push(linst); solInstances.push(rinst); ltype.ApplySolToContainer() } else { const lsolInstances = curlsol._GetOwnInstances(); const rsolInstances = currsol._GetOwnInstances(); C3.clearArray(lsolInstances); C3.clearArray(rsolInstances); lsolInstances.push(linst); rsolInstances.push(rinst); ltype.ApplySolToContainer(); rtype.ApplySolToContainer() } yield*currentEvent.DebugRetrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } } else CollMemory_Remove(collMemory, linst, rinst) } C3.clearArray(tempCandidates1) } eventStack.Pop(); return false }, IsOverlapping(rtype) { return DoOverlapCondition(this, rtype, 0, 0) }, IsOverlappingOffset(rtype, offX, offY) { return DoOverlapCondition(this, rtype, offX, offY) }, IsAnimPlaying(animName) { return C3.equalsNoCase(this._GetCurrentAnimationName(), animName) }, CompareFrame(cmp, frameNum) { return C3.compare(this._currentFrameIndex, cmp, frameNum) }, CompareAnimSpeed(cmp, x) { return C3.compare(this._GetAnimSpeed(), cmp, x) }, OnAnimFinished(animName) { return C3.equalsNoCase(this._animTriggerName, animName) }, OnAnyAnimFinished() { return true }, OnFrameChanged() { return true }, IsMirrored() { return this.GetWorldInfo().GetWidth() < 0 }, IsFlipped() { return this.GetWorldInfo().GetHeight() < 0 }, OnURLLoaded() { return true }, OnURLFailed() { return true }, IsCollisionEnabled() { return this.GetWorldInfo().IsCollisionEnabled() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Sprite.Acts = { Spawn(objectClass, layer, imgPt) { if (!objectClass || !layer) return; const [imgPtX,imgPtY] = this.GetImagePoint(imgPt); const inst = this._runtime.CreateInstance(objectClass, layer, imgPtX, imgPtY); if (!inst) return; if (objectClass.GetPlugin().IsRotatable()) { const instWi = inst.GetWorldInfo(); instWi.SetAngle(this.GetWorldInfo().GetAngle()); instWi.SetBboxChanged() } const eventSheetManager = this._runtime.GetEventSheetManager(); eventSheetManager.BlockFlushingInstances(true); inst._TriggerOnCreated(); if (inst.IsInContainer()) for (const s of inst.siblings()) s._TriggerOnCreated(); eventSheetManager.BlockFlushingInstances(false); const act = this._runtime.GetCurrentAction(); const actData = act.GetSavedDataMap(); let resetSol = false; if (!actData.has("Spawn_LastExec") || actData.get("Spawn_LastExec") < this._runtime.GetExecCount()) { resetSol = true; actData.set("Spawn_LastExec", this._runtime.GetExecCount()) } if (objectClass !== this.GetObjectClass()) { const sol = objectClass.GetCurrentSol(); sol._SetSelectAll(false); const solInstances = sol._GetOwnInstances(); if (resetSol) { C3.clearArray(solInstances); solInstances.push(inst) } else solInstances.push(inst); if (inst.IsInContainer()) for (const s of inst.siblings()) { const sol2 = s.GetObjectClass().GetCurrentSol(); if (resetSol) sol2.SetSinglePicked(s); else { sol2._SetSelectAll(false); sol2._PushInstance(s) } } } }, StopAnim() { this.SetAnimationPlaying(false) }, StartAnim(from) { this._StartAnim(from) }, SetAnim(animName, from) { this._SetAnim(animName, from) }, SetAnimFrame(frameNum) { this._SetAnimFrame(frameNum) }, SetAnimSpeed(s) { this._SetAnimSpeed(s) }, SetAnimRepeatToFrame(f) { this._SetAnimRepeatToFrame(f) }, SetMirrored(m) { const wi = this.GetWorldInfo(); const oldW = wi.GetWidth(); const newW = Math.abs(oldW) * (m === 0 ? -1 : 1); if (oldW === newW) return; wi.SetWidth(newW); wi.SetBboxChanged() }, SetFlipped(f) { const wi = this.GetWorldInfo(); const oldH = wi.GetHeight(); const newH = Math.abs(oldH) * (f === 0 ? -1 : 1); if (oldH === newH) return; wi.SetHeight(newH); wi.SetBboxChanged() }, SetScale(s) { const frame = this._currentAnimationFrame; const imageInfo = frame.GetImageInfo(); const wi = this.GetWorldInfo(); const mirrorFactor = wi.GetWidth() < 0 ? -1 : 1; const flipFactor = wi.GetHeight() < 0 ? -1 : 1; const newWidth = imageInfo.GetWidth() * s * mirrorFactor; const newHeight = imageInfo.GetHeight() * s * flipFactor; if (wi.GetWidth() !== newWidth || wi.GetHeight() !== newHeight) { wi.SetSize(newWidth, newHeight); wi.SetBboxChanged() } }, async LoadURL(url, resize, crossOrigin) { const curAnimFrame = this._currentAnimationFrame; const curImageInfo = curAnimFrame.GetImageInfo(); const wi = this.GetWorldInfo(); const runtime = this._runtime; if (curImageInfo.GetURL() === url) { if (resize === 0) { wi.SetSize(curImageInfo.GetWidth(), curImageInfo.GetHeight()); wi.SetBboxChanged() } this.Trigger(C3.Plugins.Sprite.Cnds.OnURLLoaded); return } const imageInfo = C3.New(C3.ImageInfo); await imageInfo.LoadDynamicAsset(runtime, url); if (!imageInfo.IsLoaded()) { this.Trigger(C3.Plugins.Sprite.Cnds.OnURLFailed); return } await imageInfo.LoadStaticTexture(runtime.GetWebGLRenderer(), { sampling: this._runtime.GetSampling() }); curImageInfo.ReplaceWith(imageInfo); this._sdkType._UpdateAllCurrentTexture(); if (!this.WasReleased() && resize === 0) { wi.SetSize(curImageInfo.GetWidth(), curImageInfo.GetHeight()); wi.SetBboxChanged() } runtime.UpdateRender(); if (!this.WasReleased()) await this.TriggerAsync(C3.Plugins.Sprite.Cnds.OnURLLoaded) }, SetCollisions(e) { this.GetWorldInfo().SetCollisionEnabled(e) }, SetSolidCollisionFilter(mode, tags) { this.GetWorldInfo().SetSolidCollisionFilter(mode === 0, tags) }, SetEffect(effect) { this.GetWorldInfo().SetBlendMode(effect); this._runtime.UpdateRender() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Sprite.Exps = { AnimationFrame() { return this._currentFrameIndex }, AnimationFrameCount() { return this._currentAnimation.GetFrameCount() }, AnimationName() { return this._currentAnimation.GetName() }, AnimationSpeed() { return this._GetAnimSpeed() }, OriginalAnimationSpeed() { return this._currentAnimation.GetSpeed() }, ImagePointX(imgpt) { return this.GetImagePoint(imgpt)[0] }, ImagePointY(imgpt) { return this.GetImagePoint(imgpt)[1] }, ImagePointCount() { return this.GetImagePointCount() }, ImageWidth() { return this.GetCurrentImageInfo().GetWidth() }, ImageHeight() { return this.GetCurrentImageInfo().GetHeight() }, PolyPointXAt(i) { return this.GetCollisionPolyPoint(i)[0] }, PolyPointYAt(i) { return this.GetCollisionPolyPoint(i)[1] }, PolyPointCount() { return this.GetCollisionPolyPointCount() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.NinePatch = class NinePatchPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.NinePatch.Type = class NinePatchType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); this._textureSet = null; this._drawable = null } Release() { this.ReleaseTextures(); super.Release() } OnCreate() { this.GetImageInfo().LoadAsset(this._runtime) } async LoadTextures(renderer) { const imageInfo = this.GetImageInfo(); this._drawable = await imageInfo.ExtractImageToCanvas() } CreatePatch(lm, rm, tm, bm) { if (this._textureSet || !this._drawable) return; this._textureSet = new self.NinePatchTextureSet(this); this._textureSet.CreateTextures(this._drawable, lm, rm, tm, bm) } ReleaseTextures() { if (this._textureSet) { this._textureSet.Release(); this._textureSet = null } } GetTextureSet() { return this._textureSet } } } ;'use strict'; { const C3 = self.C3; const LEFT_MARGIN = 0; const RIGHT_MARGIN = 1; const TOP_MARGIN = 2; const BOTTOM_MARGIN = 3; const EDGES = 4; const FILL = 5; const INITIALLY_VISIBLE = 6; const ORIGIN = 7; const SEAMS = 8; const tempRect = C3.New(C3.Rect); const tempQuad = C3.New(C3.Quad); C3.Plugins.NinePatch.Instance = class NinePatchInstance extends C3.SDKWorldInstanceBase { constructor(inst, properties) { super(inst); this._leftMargin = 16; this._rightMargin = 16; this._topMargin = 16; this._bottomMargin = 16; this._edges = 1; this._fill = 1; this._isSeamless = true; if (properties) { this._leftMargin = properties[LEFT_MARGIN]; this._rightMargin = properties[RIGHT_MARGIN]; this._topMargin = properties[TOP_MARGIN]; this._bottomMargin = properties[BOTTOM_MARGIN]; this._edges = properties[EDGES]; this._fill = properties[FILL]; this._isSeamless = !!properties[SEAMS]; this.GetWorldInfo().SetVisible(!!properties[INITIALLY_VISIBLE]) } this._sdkType.CreatePatch(this._leftMargin, this._rightMargin, this._topMargin, this._bottomMargin) } Release() { super.Release() } Draw(renderer) { let textureSet = this._sdkType.GetTextureSet(); if (!textureSet) { this._sdkType.CreatePatch(this._leftMargin, this._rightMargin, this._topMargin, this._bottomMargin); textureSet = this._sdkType.GetTextureSet(); if (!textureSet) return } const wi = this.GetWorldInfo(); const lm = this._leftMargin; const rm = this._rightMargin; const tm = this._topMargin; const bm = this._bottomMargin; const iw = textureSet.GetImageWidth(); const ih = textureSet.GetImageHeight(); const re = iw - rm; const be = ih - bm; const bquad = wi.GetBoundingQuad(); const myx = bquad.getTlx(); const myy = bquad.getTly(); const myw = wi.GetWidth(); const myh = wi.GetHeight(); const s = this._isSeamless ? 1 : 0; const edges = this._edges; const fill = this._fill; if (lm > 0 && tm > 0) this._DrawPatch(renderer, textureSet.GetTexture(), 0, 0, lm + s, tm + s, myx, myy, lm + s, tm + s); if (rm > 0 && tm > 0) this._DrawPatch(renderer, textureSet.GetTexture(), re - s, 0, rm + s, tm + s, myx + myw - rm - s, myy, rm + s, tm + s); if (rm > 0 && bm > 0) this._DrawPatch(renderer, textureSet.GetTexture(), re - s, be - s, rm + s, bm + s, myx + myw - rm - s, myy + myh - bm - s, rm + s, bm + s); if (lm > 0 && bm > 0) this._DrawPatch(renderer, textureSet.GetTexture(), 0, be - s, lm + s, bm + s, myx, myy + myh - bm - s, lm + s, bm + s); if (edges === 0) { const off = fill === 2 ? 0 : s; if (lm > 0 && be > tm) this._TilePatch(renderer, textureSet.GetLeftTexture(), myx, myy + tm, lm + off, myh - tm - bm, 0, 0); if (rm > 0 && be > tm) this._TilePatch(renderer, textureSet.GetRightTexture(), myx + myw - rm - off, myy + tm, rm + off, myh - tm - bm, off, 0); if (tm > 0 && re > lm) this._TilePatch(renderer, textureSet.GetTopTexture(), myx + lm, myy, myw - lm - rm, tm + off, 0, 0); if (bm > 0 && re > lm) this._TilePatch(renderer, textureSet.GetBottomTexture(), myx + lm, myy + myh - bm - off, myw - lm - rm, bm + off, 0, off) } else if (edges === 1) { if (lm > 0 && be > tm) this._DrawPatch(renderer, textureSet.GetTexture(), 0, tm, lm, be - tm, myx, myy + tm, lm, myh - tm - bm); if (rm > 0 && be > tm) this._DrawPatch(renderer, textureSet.GetTexture(), re, tm, rm, be - tm, myx + myw - rm, myy + tm, rm, myh - tm - bm); if (tm > 0 && re > lm) this._DrawPatch(renderer, textureSet.GetTexture(), lm, 0, re - lm, tm, myx + lm, myy, myw - lm - rm, tm); if (bm > 0 && re > lm) this._DrawPatch(renderer, textureSet.GetTexture(), lm, be, re - lm, bm, myx + lm, myy + myh - bm, myw - lm - rm, bm) } if (be > tm && re > lm) if (fill === 0) this._TilePatch(renderer, textureSet.GetFillTexture(), myx + lm, myy + tm, myw - lm - rm, myh - tm - bm, 0, 0); else if (fill === 1) this._DrawPatch(renderer, textureSet.GetTexture(), lm, tm, re - lm, be - tm, myx + lm, myy + tm, myw - lm - rm, myh - tm - bm) } _DrawPatch(renderer, tex, sx, sy, sw, sh, dx, dy, dw, dh) { const texW = tex.GetWidth(); const texH = tex.GetHeight(); renderer.SetTexture(tex); const wi = this.GetWorldInfo(); const bquad = wi.GetBoundingQuad(); const offX = bquad.getTlx(); const offY = bquad.getTly(); tempRect.set(dx, dy, dx + dw, dy + dh); tempRect.offset(-offX, -offY); tempQuad.setFromRotatedRect(tempRect, wi.GetAngle()); tempQuad.offset(offX, offY); tempRect.set(sx / texW, sy / texH, (sx + sw) / texW, (sy + sh) / texH); renderer.Quad3(tempQuad, tempRect) } _TilePatch(renderer, tex, dx, dy, dw, dh, ox, oy) { const texW = tex.GetWidth(); const texH = tex.GetHeight(); renderer.SetTexture(tex); const wi = this.GetWorldInfo(); const bquad = wi.GetBoundingQuad(); const offX = bquad.getTlx(); const offY = bquad.getTly(); tempRect.set(dx, dy, dx + dw, dy + dh); tempRect.offset(-offX, -offY); tempQuad.setFromRotatedRect(tempRect, wi.GetAngle()); tempQuad.offset(offX, offY); tempRect.set(-ox / texW, -oy / texH, (dw - ox) / texW, (dh - oy) / texH); renderer.Quad3(tempQuad, tempRect) } GetCurrentImageInfo() { this._objectClass.GetImageInfo() } GetPropertyValueByIndex(index) {} SetPropertyValueByIndex(index, value) {} } } ;'use strict'; { const C3 = self.C3; C3.Plugins.NinePatch.Cnds = {} } ;'use strict'; { const C3 = self.C3; C3.Plugins.NinePatch.Acts = { SetEffect(effect) { this.GetWorldInfo().SetBlendMode(effect); this._runtime.UpdateRender() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.NinePatch.Exps = {} } ;'use strict'; { const C3 = self.C3; function CloneDrawable(drawable) { const canvas = C3.CreateCanvas(drawable.width, drawable.height); const ctx = canvas.getContext("2d"); ctx.drawImage(drawable, 0, 0); return canvas } self.NinePatchTextureSet = class NinePatchTextureSet { constructor(sdkType) { this._sdkType = sdkType; this._runtime = this._sdkType.GetRuntime(); this._texture = null; this._fillTexture = null; this._leftTexture = null; this._rightTexture = null; this._topTexture = null; this._bottomTexture = null; this._imageWidth = 0; this._imageHeight = 0; this._renderer = this._runtime.GetWebGLRenderer(); this._isLoading = false; this._wasReleased = false } Release() { if (!this._renderer.IsContextLost()) { this._renderer.DeleteTexture(this._texture); this._renderer.DeleteTexture(this._fillTexture); this._renderer.DeleteTexture(this._leftTexture); this._renderer.DeleteTexture(this._rightTexture); this._renderer.DeleteTexture(this._topTexture); this._renderer.DeleteTexture(this._bottomTexture) } this._texture = null; this._fillTexture = null; this._leftTexture = null; this._rightTexture = null; this._topTexture = null; this._bottomTexture = null; this._sdkType = null; this._renderer = null; this._wasReleased = true } WasReleased() { return this._wasReleased } CreateTextures(drawable, lm, rm, tm, bm) { this._SliceImage(drawable, lm, rm, tm, bm) } HasCreatedTextures() { return !!this._texture } _SliceImage(drawable, lm, rm, tm, bm) { if (this._wasReleased) return; const iw = drawable.width; const ih = drawable.height; this._imageWidth = iw; this._imageHeight = ih; const re = iw - rm; const be = ih - bm; const sampling = this._runtime.GetSampling(); this._texture = this._renderer.CreateStaticTexture(CloneDrawable(drawable), { sampling }); if (re > lm && be > tm) this._fillTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), lm, tm, re, be), { wrapX: "repeat", wrapY: "repeat", sampling }); if (lm > 0 && be > tm) this._leftTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), 0, tm, lm, be), { wrapY: "repeat", sampling }); if (rm > 0 && be > tm) this._rightTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), re, tm, iw, be), { wrapY: "repeat", sampling }); if (tm > 0 && re > lm) this._topTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), lm, 0, re, tm), { wrapX: "repeat", sampling }); if (bm > 0 && re > lm) this._bottomTexture = this._renderer.CreateStaticTexture(this._SliceSubImage(CloneDrawable(drawable), lm, be, re, ih), { wrapX: "repeat", sampling }) } _SliceSubImage(drawable, x1, y1, x2, y2) { const w = x2 - x1; const h = y2 - y1; const tmpCanvas = C3.CreateCanvas(w, h); const tmpCtx = tmpCanvas.getContext("2d"); tmpCtx.drawImage(drawable, x1, y1, w, h, 0, 0, w, h); return tmpCanvas } GetImageWidth() { return this._imageWidth } GetImageHeight() { return this._imageHeight } GetTexture() { return this._texture } GetFillTexture() { return this._fillTexture } GetLeftTexture() { return this._leftTexture } GetRightTexture() { return this._rightTexture } GetTopTexture() { return this._topTexture } GetBottomTexture() { return this._bottomTexture } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Arr = class ArrayPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Arr.Type = class ArrayType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const IInstance = self.IInstance; function ResizeArray(arr, len, data) { if (len < arr.length) C3.truncateArray(arr, len); else if (len > arr.length) if (typeof data === "function") for (let i = arr.length; i < len; ++i) arr.push(data()); else for (let i = arr.length; i < len; ++i) arr.push(data) } C3.Plugins.Arr.Instance = class ArrayInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this._cx = 10; this._cy = 1; this._cz = 1; this._arr = null; this._forX = []; this._forY = []; this._forZ = []; this._forDepth = -1; if (properties) { this._cx = properties[0]; this._cy = properties[1]; this._cz = properties[2] } this._arr = C3.MakeFilledArray(this._cx, ()=>C3.MakeFilledArray(this._cy, ()=>C3.MakeFilledArray(this._cz, 0))) } Release() { this._arr = null; super.Release() } At(x, y, z) { x = Math.floor(x); y = Math.floor(y); z = Math.floor(z); if (x >= 0 && x < this._cx && y >= 0 && y < this._cy && z >= 0 && z < this._cz) return this._arr[x][y][z]; else return 0 } Set(x, y, z, val) { x = Math.floor(x); y = Math.floor(y); z = Math.floor(z); if (x >= 0 && x < this._cx && y >= 0 && y < this._cy && z >= 0 && z < this._cz) this._arr[x][y][z] = val } SetSize(w, h, d) { w = Math.floor(w); h = Math.floor(h); d = Math.floor(d); if (w < 0) w = 0; if (h < 0) h = 0; if (d < 0) d = 0; if (this._cx === w && this._cy === h && this._cz === d) return; this._cx = w; this._cy = h; this._cz = d; const arr = this._arr; ResizeArray(arr, w, ()=>C3.MakeFilledArray(h, ()=>C3.MakeFilledArray(d, 0))); for (let x = 0; x < w; ++x) { ResizeArray(arr[x], h, ()=>C3.MakeFilledArray(d, 0)); for (let y = 0; y < h; ++y) ResizeArray(arr[x][y], d, 0) } } GetWidth() { return this._cx } GetHeight() { return this._cy } GetDepth() { return this._cz } GetDebuggerProperties() { const prefix = "plugins.arr.debugger"; const propsPrefix = "plugins.arr.properties"; const ret = [{ title: prefix + ".array-properties.title", properties: [{ name: propsPrefix + ".width.name", value: this._cx, onedit: v=>this.SetSize(v, this._cy, this._cz) }, { name: propsPrefix + ".height.name", value: this._cy, onedit: v=>this.SetSize(this._cx, v, this._cz) }, { name: propsPrefix + ".depth.name", value: this._cz, onedit: v=>this.SetSize(this._cx, this._cy, v) }, { name: propsPrefix + ".elements.name", value: this._cx * this._cy * this._cz }] }]; const dataProps = []; if (this._cy === 1 && this._cz === 1) for (let x = 0; x < this._cx; ++x) dataProps.push({ name: "$" + x, value: this._arr[x][0][0], onedit: v=>this._arr[x][0][0] = v }); else for (let x = 0; x < this._cx; ++x) dataProps.push({ name: "$" + x, value: this._arr[x].toString() }); if (dataProps.length) ret.push({ title: prefix + ".array-data.title", properties: dataProps }); return ret } GetAsJsonString() { return JSON.stringify({ "c2array": true, "size": [this._cx, this._cy, this._cz], "data": this._arr }) } SaveToJson() { return { "size": [this._cx, this._cy, this._cz], "data": this._arr } } LoadFromJson(o) { const sz = o["size"]; this._cx = sz[0]; this._cy = sz[1]; this._cz = sz[2]; this._arr = o["data"] } _GetForX() { if (this._forDepth >= 0 && this._forDepth < this._forX.length) return this._forX[this._forDepth]; else return 0 } _GetForY() { if (this._forDepth >= 0 && this._forDepth < this._forY.length) return this._forY[this._forDepth]; else return 0 } _GetForZ() { if (this._forDepth >= 0 && this._forDepth < this._forZ.length) return this._forZ[this._forDepth]; else return 0 } GetScriptInterfaceClass() { return self.IArrayInstance } } ; const map = new WeakMap; self.IArrayInstance = class IArrayInstance extends IInstance { constructor() { super(); map.set(this, IInstance._GetInitInst().GetSdkInstance()) } get width() { return map.get(this).GetWidth() } get height() { return map.get(this).GetHeight() } get depth() { return map.get(this).GetDepth() } setSize(w, h=1, d=1) { map.get(this).SetSize(w, h, d) } getAt(x, y=0, z=0) { return map.get(this).At(x, y, z) } setAt(val, x, y=0, z=0) { if (typeof val !== "number" && typeof val !== "string") throw new TypeError("invalid type"); map.get(this).Set(x, y, z, val) } } } ;'use strict'; { const C3 = self.C3; function DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame) { eventSheetManager.PushCopySol(solModifiers); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } C3.Plugins.Arr.Cnds = { CompareX(x, cmp, val) { return C3.compare(this.At(x, 0, 0), cmp, val) }, CompareXY(x, y, cmp, val) { return C3.compare(this.At(x, y, 0), cmp, val) }, CompareXYZ(x, y, z, cmp, val) { return C3.compare(this.At(x, y, z), cmp, val) }, ArrForEach(dims) { const runtime = this._runtime; const eventSheetManager = runtime.GetEventSheetManager(); const currentEvent = runtime.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const eventStack = runtime.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const newFrame = eventStack.Push(currentEvent); const forDepth = ++this._forDepth; const forX = this._forX; const forY = this._forY; const forZ = this._forZ; const cx = this._cx; const cy = this._cy; const cz = this._cz; if (forDepth === this._forX.length) { forX.push(0); forY.push(0); forZ.push(0) } else { forX[forDepth] = 0; forY[forDepth] = 0; forZ[forDepth] = 0 } runtime.SetDebuggingEnabled(false); if (dims === 0) for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) for (let z = 0; z < cz; ++z) { forX[forDepth] = x; forY[forDepth] = y; forZ[forDepth] = z; DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame) } else if (dims === 1) for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) { forX[forDepth] = x; forY[forDepth] = y; DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame) } else for (let x = 0; x < cx; ++x) { forX[forDepth] = x; DoForEachTrigger(eventSheetManager, currentEvent, solModifiers, oldFrame, newFrame) } runtime.SetDebuggingEnabled(true); this._forDepth--; eventStack.Pop(); return false }, CompareCurrent(cmp, val) { return C3.compare(this.At(this._GetForX(), this._GetForY(), this._GetForZ()), cmp, val) }, Contains(val) { const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) for (let z = 0; z < cz; ++z) if (arr[x][y][z] === val) return true; return false }, IsEmpty() { return this._cx === 0 || this._cy === 0 || this._cz === 0 }, CompareSize(axis, cmp, val) { let s = 0; switch (axis) { case 0: s = this._cx; break; case 1: s = this._cy; break; case 2: s = this._cz; break } return C3.compare(s, cmp, val) } } } ;'use strict'; { const C3 = self.C3; function CompareValues(va, vb) { if (typeof va === "number" && typeof vb === "number") return va - vb; else { const sa = va.toString(); const sb = vb.toString(); if (sa < sb) return -1; else if (sa > sb) return 1; else return 0 } } C3.Plugins.Arr.Acts = { Clear(v) { const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) for (let z = 0; z < cz; ++z) arr[x][y][z] = v }, SetSize(w, h, d) { this.SetSize(w, h, d) }, SetX(x, val) { this.Set(x, 0, 0, val) }, SetXY(x, y, val) { this.Set(x, y, 0, val) }, SetXYZ(x, y, z, val) { this.Set(x, y, z, val) }, Push(where, value, axis) { const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; if (axis === 0) { const add = C3.MakeFilledArray(cy, ()=>C3.MakeFilledArray(cz, value)); if (where === 0) arr.push(add); else arr.unshift(add); this._cx++ } else if (axis === 1) { for (let x = 0; x < cx; ++x) { const add = C3.MakeFilledArray(cz, value); if (where === 0) arr[x].push(add); else arr[x].unshift(add) } this._cy++ } else { for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) if (where === 0) arr[x][y].push(value); else arr[x][y].unshift(value); this._cz++ } }, Pop(where, axis) { const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; if (axis === 0) { if (cx === 0) return; if (where === 0) arr.pop(); else arr.shift(); this._cx-- } else if (axis === 1) { if (cy === 0) return; for (let x = 0; x < cx; ++x) if (where === 0) arr[x].pop(); else arr[x].shift(); this._cy-- } else { if (cz === 0) return; for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) if (where === 0) arr[x][y].pop(); else arr[x][y].shift(); this._cz-- } }, Reverse(axis) { const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; if (cx === 0 || cy === 0 || cz === 0) return; if (axis === 0) arr.reverse(); else if (axis === 1) for (let x = 0; x < cx; ++x) arr[x].reverse(); else for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) arr[x][y].reverse() }, Sort(axis) { const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; if (cx === 0 || cy === 0 || cz === 0) return; if (axis === 0) arr.sort((a,b)=>CompareValues(a[0][0], b[0][0])); else if (axis === 1) for (let x = 0; x < cx; ++x) arr[x].sort((a,b)=>CompareValues(a[0], b[0])); else for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) arr[x][y].sort(CompareValues) }, Delete(index, axis) { index = Math.floor(index); if (index < 0) return; const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; if (axis === 0) { if (index >= cx) return; arr.splice(index, 1); this._cx-- } else if (axis === 1) { if (index >= cy) return; for (let x = 0; x < cx; ++x) arr[x].splice(index, 1); this._cy-- } else { if (index >= cz) return; for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) arr[x][y].splice(index, 1); this._cz-- } }, Insert(value, index, axis) { index = Math.floor(index); if (index < 0) return; const cx = this._cx; const cy = this._cy; const cz = this._cz; const arr = this._arr; if (axis === 0) { if (index > cx) return; arr.splice(index, 0, C3.MakeFilledArray(cy, ()=>C3.MakeFilledArray(cz, value))); this._cx++ } else if (axis === 1) { if (index > cy) return; for (let x = 0; x < cx; ++x) arr[x].splice(index, 0, C3.MakeFilledArray(cz, value)); this._cy++ } else { if (index > cz) return; for (let x = 0; x < cx; ++x) for (let y = 0; y < cy; ++y) arr[x][y].splice(index, 0, value); this._cz++ } }, JSONLoad(json) { let o = null; try { o = JSON.parse(json) } catch (err) { console.error("[Construct 3] Failed to parse JSON: ", err); return } if (!o["c2array"]) return; const sz = o["size"]; this._cx = sz[0]; this._cy = sz[1]; this._cz = sz[2]; this._arr = o["data"] }, JSONDownload(filename) { const url = URL.createObjectURL(new Blob([this.GetAsJsonString()],{ type: "application/json" })); this._runtime.InvokeDownload(url, filename) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Arr.Exps = { At(x, y, z) { return this.At(x, y || 0, z || 0) }, Width() { return this._cx }, Height() { return this._cy }, Depth() { return this._cz }, CurX() { return this._GetForX() }, CurY() { return this._GetForY() }, CurZ() { return this._GetForZ() }, CurValue() { return this.At(this._GetForX(), this._GetForY(), this._GetForZ()) }, Front() { return this.At(0, 0, 0) }, Back() { return this.At(this._cx - 1, 0, 0) }, IndexOf(v) { const arr = this._arr; for (let x = 0, len = this._cx; x < len; ++x) if (arr[x][0][0] === v) return x; return -1 }, LastIndexOf(v) { const arr = this._arr; for (let x = this._cx - 1; x >= 0; --x) if (arr[x][0][0] === v) return x; return -1 }, AsJSON() { return this.GetAsJsonString() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.AJAX = class AJAXPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.AJAX.Type = class AJAXType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; C3.Plugins.AJAX.Instance = class AJAXInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this._lastData = ""; this._curTag = ""; this._progress = 0; this._timeout = -1; this._nextRequestHeaders = new Map; this._nextReponseBinaryData = null; this._nextRequestOverrideMimeType = ""; this._nwjsFs = null; this._nwjsPath = null; this._nwjsAppFolder = null; this._isNWjs = this._runtime.GetExportType() === "nwjs"; if (this._isNWjs) { this._nwjsFs = require("fs"); this._nwjsPath = require("path"); const process = self["process"] || nw["process"]; this._nwjsAppFolder = this._nwjsPath["dirname"](process["execPath"]) + "\\" } } Release() { super.Release() } async _TriggerError(tag, url, err) { console.error(`[Construct 3] AJAX request to '${url}' (tag '${tag}') failed: `, err); this._curTag = tag; await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnAnyError); await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnError) } async _TriggerComplete(tag) { this._curTag = tag; await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnAnyComplete); await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnComplete) } async _OnProgress(tag, e) { if (!e["lengthComputable"]) return; this._progress = e["loaded"] / e["total"]; this._curTag = tag; await this.TriggerAsync(C3.Plugins.AJAX.Cnds.OnProgress) } _OnError(tag, url, err) { if (!this._isNWjs) { this._TriggerError(tag, url, err); return } const fs = this._nwjsFs; const filePath = this._nwjsAppFolder + url; if (fs["existsSync"](filePath)) fs["readFile"](filePath, { "encoding": "utf8" }, (err2,data)=>{ if (err2) this._TriggerError(tag, url, err2); else { this._lastData = data.replace(/\r\n/g, "\n"); this._TriggerComplete(tag) } } ); else this._TriggerError(tag, url, err) } async _DoCordovaRequest(tag, file) { const assetManager = this._runtime.GetAssetManager(); const binaryData = this._nextReponseBinaryData; this._nextReponseBinaryData = null; try { if (binaryData) { const buffer = await assetManager.CordovaFetchLocalFileAsArrayBuffer(file); binaryData.SetArrayBufferTransfer(buffer); this._lastData = ""; this._TriggerComplete(tag) } else { const data = await assetManager.CordovaFetchLocalFileAsText(file); this._lastData = data.replace(/\r\n/g, "\n"); this._TriggerComplete(tag) } } catch (err) { this._TriggerError(tag, file, err) } } _DoRequest(tag, url, method, data) { return new Promise(resolve=>{ const errorFunc = err=>{ this._OnError(tag, url, err); resolve() } ; const binaryData = this._nextReponseBinaryData; this._nextReponseBinaryData = null; try { const request = new XMLHttpRequest; request.onreadystatechange = ()=>{ if (request.readyState === 4) { if (binaryData) this._lastData = ""; else this._lastData = (request.responseText || "").replace(/\r\n/g, "\n"); if (request.status >= 400) this._TriggerError(tag, url, request.status + request.statusText); else { const hasData = this._lastData.length || binaryData && request.response instanceof ArrayBuffer; if ((!this._isNWjs || hasData) && !(!this._isNWjs && request.status === 0 && !hasData)) { if (binaryData) binaryData.SetArrayBufferTransfer(request.response); this._TriggerComplete(tag) } } resolve() } } ; request.onerror = errorFunc; request.ontimeout = errorFunc; request.onabort = errorFunc; request["onprogress"] = e=>this._OnProgress(tag, e); request.open(method, url); if (this._timeout >= 0 && typeof request["timeout"] !== "undefined") request["timeout"] = this._timeout; request.responseType = binaryData ? "arraybuffer" : "text"; if (data && !this._nextRequestHeaders.has("Content-Type")) if (typeof data !== "string") request["setRequestHeader"]("Content-Type", "application/octet-stream"); else request["setRequestHeader"]("Content-Type", "application/x-www-form-urlencoded"); for (const [header,value] of this._nextRequestHeaders) try { request["setRequestHeader"](header, value) } catch (err) { console.error(`[Construct 3] AJAX: Failed to set header '${header}: ${value}': `, err) } this._nextRequestHeaders.clear(); if (this._nextRequestOverrideMimeType) { try { request["overrideMimeType"](this._nextRequestOverrideMimeType) } catch (err) { console.error(`[Construct 3] AJAX: failed to override MIME type: `, err) } this._nextRequestOverrideMimeType = "" } if (data) request.send(data); else request.send() } catch (err) { errorFunc(err) } } ) } GetDebuggerProperties() { const prefix = "plugins.ajax.debugger"; return [{ title: prefix + ".title", properties: [{ name: prefix + ".last-data", value: this._lastData }] }] } SaveToJson() { return { "lastData": this._lastData } } LoadFromJson(o) { this._lastData = o["lastData"]; this._curTag = ""; this._progress = 0 } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.AJAX.Cnds = { OnComplete(tag) { return C3.equalsNoCase(this._curTag, tag) }, OnAnyComplete() { return true }, OnError(tag) { return C3.equalsNoCase(this._curTag, tag) }, OnAnyError() { return true }, OnProgress(tag) { return C3.equalsNoCase(this._curTag, tag) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.AJAX.Acts = { async Request(tag, url) { if (this._runtime.IsCordova() && C3.IsRelativeURL(url) && location.protocol === "file:") await this._DoCordovaRequest(tag, url); else if (this._runtime.IsPreview() && C3.IsRelativeURL(url)) { const localurl = this._runtime.GetAssetManager().GetLocalUrlAsBlobUrl(url.toLowerCase()); await this._DoRequest(tag, localurl, "GET", null) } else await this._DoRequest(tag, url, "GET", null) }, async RequestFile(tag, file) { if (this._runtime.IsCordova() && location.protocol === "file:") await this._DoCordovaRequest(tag, file); else await this._DoRequest(tag, this._runtime.GetAssetManager().GetLocalUrlAsBlobUrl(file), "GET", null) }, async Post(tag, url, data, method) { await this._DoRequest(tag, url, method, data) }, async PostBinary(tag, url, objectClass, method) { if (!objectClass) return; const target = objectClass.GetFirstPicked(this._inst); if (!target) return; const sdkInst = target.GetSdkInstance(); const buffer = sdkInst.GetArrayBufferReadOnly(); await this._DoRequest(tag, url, method, buffer) }, SetTimeout(t) { this._timeout = t * 1E3 }, SetHeader(n, v) { this._nextRequestHeaders.set(n, v) }, SetResponseBinary(objectClass) { if (!objectClass) return; const inst = objectClass.GetFirstPicked(this._inst); if (!inst) return; this._nextReponseBinaryData = inst.GetSdkInstance() }, OverrideMIMEType(m) { this._nextRequestOverrideMimeType = m } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.AJAX.Exps = { LastData() { return this._lastData }, Progress() { return this._progress }, Tag() { return this._curTag } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Json = class JSONPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Json.Type = class JSONType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const IInstance = self.IInstance; C3.Plugins.Json.Instance = class JSONInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this._valueCache = [null, null]; this._locationCache = [null, null]; this._data = {}; this._path = []; this._currentKey = ""; this._currentValue = 0 } Release() { super.Release() } _InvalidateValueCache() { this._valueCache[0] = null; this._valueCache[1] = null } _HasValueCache(arr) { if (arr === null || this._valueCache[0] === null) return false; return this._valueCache[0] === arr || C3.arraysEqual(this._valueCache[0], arr) } _GetValueCache() { return this._valueCache[1] } _UpdateValueCache(str, value) { this._valueCache[0] = str; this._valueCache[1] = value } _InvalidateLocationCache() { this._locationCache[0] = null; this._locationCache[1] = null } _HasLocationCache(str) { return this._locationCache[0] === str } _GetLocationCache() { return this._locationCache[1] } _UpdateLocationCache(str, value) { this._locationCache[0] = str; this._locationCache[1] = value } _SetData(obj) { this._data = obj; this._InvalidateValueCache() } _GetData() { return this._data } _SetPath(str) { this._path = this._ParsePathUnsafe(str); this._InvalidateLocationCache() } _ParsePath(str) { return C3.cloneArray(this._ParsePathUnsafe(str)) } _ParsePathUnsafe(str) { const buffer = []; let escaped = false; let parts; if (this._HasLocationCache(str)) return this._GetLocationCache(); if (str[0] === ".") { parts = C3.cloneArray(this._path); str = str.slice(1) } else parts = []; for (const c of str) if (escaped) { buffer.push(c); escaped = false } else if (c === "\\") escaped = true; else if (c === ".") { parts.push(buffer.join("")); C3.clearArray(buffer) } else buffer.push(c); if (buffer.length !== 0) parts.push(buffer.join("")); this._UpdateLocationCache(str, parts); return parts } _GetValueAtFullPath(path, lazyCreate) { if (this._HasValueCache(path)) return this._GetValueCache(); let result = this._data; for (const part of path) if (Array.isArray(result)) { const index = parseInt(part, 10); if (index < 0 || index >= result.length || !isFinite(index)) { result = null; break } result = result[index] } else if (typeof result === "object" && result !== null) if (result.hasOwnProperty(part)) result = result[part]; else if (lazyCreate) { const o = {}; result[part] = o; result = o } else { result = null; break } else { result = null; break } this._UpdateValueCache(path, result); return result } _GetValue(str) { const path = this._ParsePath(str); if (!path.length) return this._data; const key = path.pop(); const obj = this._GetValueAtFullPath(path, false); if (Array.isArray(obj)) { const index = parseInt(key, 10); return index >= 0 && index < obj.length ? obj[index] : null } else if (typeof obj === "object" && obj !== null) return obj.hasOwnProperty(key) ? obj[key] : null; else return null } _JSONTypeOf(val) { if (val === null) return "null"; else if (Array.isArray(val)) return "array"; else return typeof val } _GetTypeOf(str) { const val = this._GetValue(str); return this._JSONTypeOf(val) } _ToSafeValue(value) { const type = typeof value; if (type === "number" || type === "string") return value; else if (type === "boolean") return value ? 1 : 0; else return 0 } _GetSafeValue(str) { return this._ToSafeValue(this._GetValue(str)) } _HasKey(str) { const path = this._ParsePath(str); if (!path.length) return false; const key = path.pop(); const obj = this._GetValueAtFullPath(path, false); if (Array.isArray(obj)) { const index = parseInt(key, 10); return index >= 0 && index < obj.length } else if (typeof obj === "object" && obj !== null) return obj.hasOwnProperty(key); else return false } _SetValue(str, value) { const path = this._ParsePath(str); if (!path.length) return false; if (this._HasValueCache(path)) this._InvalidateValueCache(); const key = path.pop(); const obj = this._GetValueAtFullPath(path, true); if (Array.isArray(obj)) { const index = parseInt(key, 10); if (!isFinite(index) || index < 0 || index >= obj.length) return false; obj[index] = value; return true } else if (typeof obj === "object" && obj !== null) { obj[key] = value; return true } return false } _DeleteKey(str) { const path = this._ParsePath(str); if (!path.length) return false; if (this._HasValueCache(path)) this._InvalidateValueCache(); const key = path.pop(); const obj = this._GetValueAtFullPath(path, false); if (Array.isArray(obj)) return false; else if (typeof obj === "object" && obj !== null) { delete obj[key]; return true } else return false } SaveToJson() { return { "path": this._path, "data": this._data } } LoadFromJson(o) { this._InvalidateValueCache(); this._InvalidateLocationCache(); this._path = o["path"]; this._data = o["data"] } _SanitizeValue(val) { const type = typeof val; if (type === "number") { if (!isFinite(val)) return 0; return val } if (typeof val == "object") return JSON.stringify(val); return val + "" } GetDebuggerProperties() { const prefix = "plugins.json.debugger"; let topLevelData; try { topLevelData = this._SanitizeValue(this._data) } catch (e) { topLevelData = '"invalid"' } return [{ title: prefix + ".title", properties: [{ name: prefix + ".data", value: topLevelData, onedit: v=>{ try { const n = JSON.parse(v); this._SetData(n) } catch (e) {} } }, { name: prefix + ".path", value: this._path.map(seg=>seg.replace(/\./g, "\\.")).join(".") }] }] } GetScriptInterfaceClass() { return self.IJSONInstance } } ; const map = new WeakMap; self.IJSONInstance = class IJSONInstance extends IInstance { constructor() { super(); map.set(this, IInstance._GetInitInst().GetSdkInstance()) } getJsonDataCopy() { const data = map.get(this)._GetData(); return JSON.parse(JSON.stringify(data)) } setJsonDataCopy(o) { try { const o2 = JSON.parse(JSON.stringify(o)); map.get(this)._SetData(o2) } catch (err) { console.error("[JSON plugin] setJsonData: object is not valid JSON: ", err); throw err; } } setJsonString(str) { try { const o = JSON.parse(str); map.get(this)._SetData(o) } catch (err) { console.error("[JSON plugin] setJsonString: string is not valid JSON: ", err); throw err; } } toCompactString() { return JSON.stringify(map.get(this)._GetData()) } toBeautifiedString() { return JSON.stringify(map.get(this)._GetData(), null, 4) } } } ;'use strict'; { const C3 = self.C3; const JSON_TYPES = ["null", "boolean", "number", "string", "object", "array"]; C3.Plugins.Json.Cnds = { HasKey(str) { return this._HasKey(str) }, CompareType(str, typeIndex) { return this._GetTypeOf(str) === JSON_TYPES[typeIndex] }, CompareValue(str, cmp, value) { return C3.compare(this._GetSafeValue(str), cmp, value) }, IsBooleanSet(str) { return this._GetValue(str) === true }, ForEach(str) { const value = this._GetValue(str); if (typeof value !== "object" || value === null) return false; const runtime = this._runtime; const eventSheetManager = runtime.GetEventSheetManager(); const currentEvent = runtime.GetCurrentEvent(); const solModifiers = currentEvent.GetSolModifiers(); const eventStack = runtime.GetEventStack(); const oldFrame = eventStack.GetCurrentStackFrame(); const newFrame = eventStack.Push(currentEvent); const oldPath = this._path; const oldKey = this._currentKey; const oldValue = this._currentValue; const subPath = this._ParsePathUnsafe(str); runtime.SetDebuggingEnabled(false); for (const [k,v] of Object.entries(value)) { this._path = C3.cloneArray(subPath); this._path.push(k); this._currentKey = k; this._currentValue = v; eventSheetManager.PushCopySol(solModifiers); currentEvent.Retrigger(oldFrame, newFrame); eventSheetManager.PopSol(solModifiers) } runtime.SetDebuggingEnabled(true); this._path = oldPath; this._currentKey = oldKey; this._currentValue = oldValue; eventStack.Pop(); return false }, OnParseError() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Json.Acts = { Parse(str) { try { this._SetData(JSON.parse(str)) } catch (err) { console.warn("[JSON plugin] Failed to parse JSON data: ", err); this._SetData({}); this.Trigger(C3.Plugins.Json.Cnds.OnParseError) } }, SetPath(str) { this._SetPath(str) }, SetValue(str, value) { this._SetValue(str, value) }, SetArray(str, size) { let value = this._GetValue(str); if (Array.isArray(value)) C3.resizeArray(value, size, 0); else { value = []; C3.extendArray(value, size, 0); this._SetValue(str, value) } }, SetObject(str) { this._SetValue(str, {}) }, SetJSON(location, value) { let obj = null; try { obj = JSON.parse(value) } catch (err) { console.warn("[JSON plugin] Failed to parse JSON data: ", err); this.Trigger(C3.Plugins.Json.Cnds.OnParseError) } this._SetValue(location, obj) }, SetNull(str) { this._SetValue(str, null) }, SetBoolean(str, value) { this._SetValue(str, value !== 0) }, ToggleBoolean(str) { const value = this._GetValue(str); if (typeof value === "boolean") this._SetValue(str, !value) }, AddTo(str, inc) { const value = this._GetValue(str); if (typeof value === "number") this._SetValue(str, value + inc) }, SubtractFrom(str, dec) { const value = this._GetValue(str); if (typeof value === "number") this._SetValue(str, value - dec) }, DeleteKey(str) { this._DeleteKey(str) }, PushValue(side, str, value) { const parent = this._GetValue(str); if (Array.isArray(parent)) side === 0 ? parent.push(value) : parent.unshift(value) }, PopValue(side, str) { const parent = this._GetValue(str); if (Array.isArray(parent)) side === 0 ? parent.pop() : parent.shift() }, InsertValue(value, str, index) { const parent = this._GetValue(str); if (Array.isArray(parent)) parent.splice(index, 0, value) }, RemoveValues(count, str, index) { const parent = this._GetValue(str); if (Array.isArray(parent)) parent.splice(index, count) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Json.Exps = { ToCompactString() { try { return JSON.stringify(this._data) } catch (err) { return "" } }, ToBeautifiedString() { try { return JSON.stringify(this._data, null, 4) } catch (err) { return "" } }, Get(str) { return this._GetSafeValue(str) }, GetAsCompactString(str) { const value = this._GetValue(str); return JSON.stringify(value) }, GetAsBeautifiedString(str) { const value = this._GetValue(str); return JSON.stringify(value, null, 4) }, Front(str) { const parent = this._GetValue(str); if (Array.isArray(parent)) { const value = parent[0]; return this._ToSafeValue(value) } else return -1 }, Back(str) { const parent = this._GetValue(str); if (Array.isArray(parent)) { const value = parent[parent.length - 1]; return this._ToSafeValue(value) } else return -1 }, Type(str) { return this._GetTypeOf(str) }, ArraySize(str) { const value = this._GetValue(str); if (Array.isArray(value)) return value.length; else return -1 }, Path() { return this._path.map(seg=>seg.replace(/\./g, "\\.")).join(".") }, CurrentKey() { return this._currentKey }, CurrentValue() { return this._ToSafeValue(this._currentValue) }, CurrentType() { return this._JSONTypeOf(this._currentValue) } } } ;"use strict"; { C3.Plugins.aekiro_proui = class aekiro_prouiSingleGlobalPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Plugins.aekiro_proui.Type = class aekiro_prouiSingleGlobalType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { var C3 = self.C3; C3.Plugins.aekiro_proui.Instance = class aekiro_prouiSingleGlobalInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this.ignoreInput = false; this.goManager = globalThis.aekiro_goManager; this.goManager.init(this.GetRuntime()); this.lastLayout = null; this.GetRuntime().Dispatcher().addEventListener("beforelayoutchange", ()=>{ this.goManager.isInit = false; } ); } Initialise() { this.goManager.gos = {}; this.goManager.registerGameObjects(); this.goManager.cleanSceneGraph(); this.goManager.createSceneGraph(); this.goManager.isInit = true; } setUIAudioVolume(volume) { var list = [C3.Behaviors.aekiro_button, C3.Behaviors.aekiro_checkbox, C3.Behaviors.aekiro_radiobutton, C3.Behaviors.aekiro_dialog]; var behaviorBase, insts, audioSources; for (var i = 0, l = list.length; i < l; i++) { behaviorBase = this.GetRuntime()._pluginManager._behaviorsByCtor.get(list[i]); if (!behaviorBase) continue; insts = behaviorBase.GetInstances(); for (var j = 0, m = insts.length; j < m; j++) { audioSources = insts[j].GetUnsavedDataMap().audioSources; if (!audioSources) continue; for (var key in audioSources) { audioSources[key].setVolume(volume); } } } } isTypeValid(inst, types) { var ctr = inst.GetPlugin().constructor; for (var i = 0, l = types.length; i < l; i++) { if (ctr == types[i]) { return true; } } return false; } Release() { super.Release(); } SaveToJson() { return {}; } LoadFromJson(o) {} } ; } var Tween = globalThis["TWEEN"]; globalThis.Aekiro = {}; globalThis.AudioSource = class AudioSource { constructor(opts, runtime) { this.runtime = runtime; this.parseConfig(opts); if (C3.Plugins.Audio) { this.act_PlayByName = C3.Plugins.Audio.Acts.PlayByName; } } parseConfig(opts) { opts = opts.split(";"); this.fileName = opts[0]; this.volume = parseInt(opts[1]); if (!this.volume) this.volume = 0; } getAudioSdkInstance() { if (!this.audio) { var plugin = this.runtime.GetSingleGlobalObjectClassByCtor(C3.Plugins.Audio); if (plugin) { this.audio = plugin.GetSingleGlobalInstance().GetSdkInstance(); } } return this.audio; } setVolume(v) { this.volume = v; } play() { if (!this.fileName) return; var audio = this.getAudioSdkInstance(); if (!audio) { console.error("ProUI: Please add the Audio plugin to the project."); return; } this.act_PlayByName.call(audio, 0, this.fileName, 0, this.volume, "sound"); } } ; globalThis.EventManager = class EventManager { constructor(inst) { this.map = {}; this.inst = inst; } on(eventName, callback, options) { if (!this.map[eventName]) { this.map[eventName] = []; } var once = false; if (options) { once = options["once"]; } var listener = { "callback": callback, "once": once, "eventName": eventName }; this.map[eventName].push(listener); return listener; } emit(eventName, options) { options = options || {}; var listeners = this.map[eventName]; var listener; if (listeners) { for (var i = 0, l = listeners.length; i < l; i++) { listener = listeners[i]; listener["callback"](options["args"]); if (listener["once"]) { this.removeListener(listener); l = listeners.length; i--; } } } if (options["propagate"] == undefined) options["propagate"] = true; if (options["bubble"] == undefined) options["bubble"] = true; var options2 = Object.assign({}, options); options2["propagate"] = false; if (options["bubble"] === true && this.inst) { var go = this.inst.GetUnsavedDataMap().aekiro_gameobject; if (go.parent) { go.parent.GetUnsavedDataMap().aekiro_gameobject.eventManager.emit(eventName, options2); } } options2 = Object.assign({}, options); options2["bubble"] = false; if (options["propagate"] === true && this.inst) { var go = this.inst.GetUnsavedDataMap().aekiro_gameobject; var children = go.children; for (var i = 0, l = children.length; i < l; i++) { children[i].GetUnsavedDataMap().aekiro_gameobject.eventManager.emit(eventName, options); } } } removeListener(listener) { var listeners = this.map[listener["eventName"]]; var index = listeners.indexOf(listener); listeners.splice(index, 1); } } ; globalThis.aekiro_goManager = { gos: {}, haltNext: false, isRegistering: false, eventManager: new globalThis.EventManager(), lastLayout: 0, init: function(runtime) { if (this.runtime) return; this.runtime = runtime; this.runtime.Dispatcher().addEventListener("instancedestroy", function(e) { var go = e.instance.GetUnsavedDataMap().aekiro_gameobject; if (go) { go.Release2(); } }); }, clean: function() { var key; for (key in this.gos) { if (this.gos[key].IsDestroyed()) { this.removeGO(key); } } }, addGO: function(inst) { if (!inst) return; if (this.haltNext) return; var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject.name) { aekiro_gameobject.name = "o" + inst.GetUID(); } var name = aekiro_gameobject.name; if (this.gos.hasOwnProperty(name)) { console.error("Aekiro Hierarchy: GameObject already exist with name: %s !", name); aekiro_gameobject.name = "o" + inst.GetUID(); name = aekiro_gameobject.name; } this.gos[name] = inst; }, removeGO: function(name) { delete this.gos[name]; }, setGoName: function(oldName, newName) { if (!this.gos[oldName]) { throw new Error("ProUI-goManager.setGoName() : game object to be renamed not found"); } if (this.gos.hasOwnProperty(newName)) { throw new Error("ProUI-goManager.setGoName() : game object already exist with name: " + name); } this.gos[newName] = this.gos[oldName]; this.removeGO(oldName); }, getName: function(inst) { var key; for (key in this.gos) { if (this.gos[key] == inst) { return key; } } return false; }, removeGO2: function(inst) { var key; for (key in this.gos) { if (this.gos[key] == inst) { this.removeGO(key); } } }, createInstance: function(objectClass, layer, x, y) { var inst = this.runtime.CreateInstance(this.runtime.GetObjectClassByName(objectClass), layer, x, y); const b = this.runtime.GetEventSheetManager(); b.BlockFlushingInstances(!0); b.BlockFlushingInstances(!1); return inst; }, clone: function(template, name, parent, layer, x, y, onNodeCreated) { if (this.gos[name]) { console.error("Aekiro GameObject: GameObject already exist with name: %s !", name); return; } if (typeof parent === 'string') { parent = this.gos[parent]; } if (parent) { var wp = parent.GetWorldInfo(); var res = this.globalToLocal3(x, y, 0, wp.GetX(), wp.GetY(), wp.GetAngle()); x = res.x; y = res.y; } var inst = this._clone(template, name, parent, layer, x, y, onNodeCreated); inst.GetUnsavedDataMap().aekiro_gameobject.children_update(); inst.GetUnsavedDataMap().aekiro_gameobject.updateZindex(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; aekiro_gameobject.eventManager.emit("cloned"); return inst; }, _clone: function(t_node, name, parent, layer, x, y, onNodeCreated) { this.haltNext = true; var inst = this.createInstance(t_node.type, layer); this.haltNext = false; var b; try { b = JSON.parse(t_node.json); } catch (a) { return void console.error("Failed to load from JSON string: ", a); } inst.LoadFromJson(b, !0); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; inst.GetUnsavedDataMap().zindex = t_node.zindex; inst.GetSdkInstance().CallAction(aekiro_gameobject.acts.MoveToLayer, layer); aekiro_gameobject.name = ""; aekiro_gameobject.parentName = ""; if (name) aekiro_gameobject.name = name; this.addGO(inst); if (parent) { parent.GetUnsavedDataMap().aekiro_gameobject.children_add(inst); } var wi = inst.GetWorldInfo(); wi.SetX(x, true); wi.SetY(y, true); wi.SetBboxChanged(); if (onNodeCreated) onNodeCreated(inst); inst._TriggerOnCreated(); var child; for (var i = 0, l = t_node.children.length; i < l; i++) { child = t_node.children[i]; this._clone(child, null, inst, layer, child.x, child.y, onNodeCreated); } return inst; }, globalToLocal3: function(x, y, a, p_x, p_y, p_angle) { var res = {}; res.x = (x - p_x) * Math.cos(p_angle) + (y - p_y) * Math.sin(p_angle); res.y = -(x - p_x) * Math.sin(p_angle) + (y - p_y) * Math.cos(p_angle); res.angle = a - p_angle; return res; }, registerGameObjects: function() { var aekiro_gameobjectBehaviorBase = this.runtime._pluginManager._behaviorsByCtor.get(C3.Behaviors.aekiro_gameobject); if (!aekiro_gameobjectBehaviorBase) return; var insts = aekiro_gameobjectBehaviorBase.GetInstances(); var l = insts.length; for (var i = 0; i < l; i++) { if (!insts[i].IsDestroyed()) { this.addGO(insts[i]); } } }, createSceneGraph: function() { var key, go, aekiro_gameobject; var parentSameLayer = {}; for (key in this.gos) { go = this.gos[key]; aekiro_gameobject = go.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject.parentName && this.gos[aekiro_gameobject.parentName]) { this.gos[aekiro_gameobject.parentName].GetUnsavedDataMap().aekiro_gameobject.children_add(go); } if (aekiro_gameobject.parentSameLayer) { parentSameLayer[key] = go; } } for (key in parentSameLayer) { go = parentSameLayer[key]; aekiro_gameobject = go.GetUnsavedDataMap().aekiro_gameobject; aekiro_gameobject.children_addFromLayer(aekiro_gameobject.GetWorldInfo().GetLayer()); } for (key in this.gos) { this.gos[key].GetUnsavedDataMap().aekiro_gameobject.children_update(); } this.eventManager.emit("childrenRegistred"); }, cleanSceneGraph: function() { var key, inst; for (key in this.gos) { inst = this.gos[key]; inst.GetUnsavedDataMap().aekiro_gameobject.removeFromParent(); } } }; globalThis.Aekiro.button = class aekiro_button extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); } button_constructor() { this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui); if (this.proui) { this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance(); } this.proui.isTypeValid(this.GetObjectInstance(), [C3.Plugins.Sprite, C3.Plugins.NinePatch, C3.Plugins.TiledBg], "Pro UI: Button behavior is only applicable to Sprite, 9-patch or tiled backgrounds objects."); this.inst = this.GetObjectInstance(); this.wi = this.inst.GetWorldInfo(); this.goManager = globalThis.aekiro_goManager; this.scrollViews = globalThis.aekiro_scrollViewManager.scrollViews; this.aekiro_dialogManager = globalThis.aekiro_dialogManager; this.GetObjectInstance().GetUnsavedDataMap().aekiro_button = this; this.isInstanceOfSprite = this.GetObjectInstance().GetPlugin().constructor == C3.Plugins.Sprite; this.STATES = { NORMAL: 0, HOVER: 1, CLICKED: 2, DISABLED: 3, FOCUSED: 4 }; this.isOnMobile = C3.Platform.IsMobile; this.isTouchStarted = false; this.isMouseEnter = false; this.isFocused = false; this.callbacks = []; this.frameAnim = []; this.initProps = { animationFrame: null, animationName: null, color: null }; } PostCreate() { this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject; this.sdkInstance = this.GetObjectInstance().GetSdkInstance(); this.sdkInstance_callAction = this.sdkInstance.CallAction; this.sdkInstance_callExpression = this.sdkInstance.CallExpression; this.sdkInstance_acts = this.GetObjectInstance().GetPlugin().constructor.Acts; this.sdkInstance_exps = this.GetObjectInstance().GetPlugin().constructor.Exps; this.onPropsLoaded(); this.updateViewTick(); } onPropsLoaded() { this.useStates = true; if (!this.isInstanceOfSprite || (this.frame_normal == "" && this.frame_hover == "" && this.frame_clicked == "" && this.frame_disabled == "")) { this.useStates = false; } this.state = this.isEnabled ? this.STATES.NORMAL : this.STATES.DISABLED; this.setInitProps(); this.initSounds(); this.initFrameAnim(); this.initAnimations(); this.initColors(); } onInitPropsLoaded() { var t = this.initProps.color; this.initProps.color = new C3.Color(); this.initProps.color.setFromJSON(t); } updateView() { this.setFrameAnim(this.state); this.setColor(this.state); } updateViewTick() { this.updateV = true; this._StartTicking(); } setEnabled(isEnabled) { if (this.isEnabled == isEnabled) return; this.isEnabled = isEnabled; this.state = isEnabled ? this.STATES.NORMAL : this.STATES.DISABLED; this.setFrameAnim(this.state); this.setColor(this.state); } parseFrameAnim(frameAnim, defaults) { if (frameAnim == undefined) frameAnim = ""; frameAnim = frameAnim.split('/'); var frame, anim; if (isNaN(parseInt(frameAnim[0]))) { anim = frameAnim[0]; frame = parseInt(frameAnim[1]) } else { anim = frameAnim[1]; frame = parseInt(frameAnim[0]); } if (isNaN(frame)) { frame = defaults ? defaults["f"] : this.initProps.animationFrame; } if (!isNaN(anim) || !anim) { anim = defaults ? defaults["a"] : this.initProps.animationName; } var res = { "f": frame, "a": anim }; return res; } parseColor(color, defaultColor) { if (color) { color = color.split(","); color = new C3.Color(color[0] / 255,color[1] / 255,color[2] / 255,1); } else { if (defaultColor !== undefined) { color = defaultColor; } else { color = this.initProps.color; } } return color; } initSounds() { var map = this.GetObjectInstance().GetUnsavedDataMap(); if (!map.audioSources) { map.audioSources = {}; } var AudioSource = globalThis.AudioSource; this.audioSources = map.audioSources; this.audioSources.click = new AudioSource(this.clickSound,this.GetRuntime()); this.audioSources.hover = new AudioSource(this.hoverSound,this.GetRuntime()); this.audioSources.focus = new AudioSource(this.focusSound,this.GetRuntime()); } initColors() { this.colors = []; this.colors[this.STATES.NORMAL] = this.parseColor(this.color_normal); this.colors[this.STATES.HOVER] = this.parseColor(this.color_hover, null); this.colors[this.STATES.CLICKED] = this.parseColor(this.color_clicked, null); this.colors[this.STATES.DISABLED] = this.parseColor(this.color_disabled); this.colors[this.STATES.FOCUSED] = this.parseColor(this.color_focus, null); } setColor(state) { var color; if (this.isFocused) { if (this.state == this.STATES.NORMAL) { color = this.colors[this.STATES.FOCUSED] || this.colors[this.STATES.NORMAL]; } else { color = this.colors[state] || this.colors[this.STATES.FOCUSED]; if (!this.colors[state] && !this.colors[this.STATES.FOCUSED]) { color = this.colors[this.STATES.NORMAL]; } } } else { color = this.colors[state]; } if (color) { this.wi.SetUnpremultipliedColor(color); this.wi.SetBboxChanged(); } } setInitProps() { if (this.isInstanceOfSprite) { this.initProps.animationFrame = this.initProps.animationFrame === null ? this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationFrame) : this.initProps.animationFrame; this.initProps.animationName = this.initProps.animationName || this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationName); } this.initProps.color = this.initProps.color || this.wi.GetUnpremultipliedColor(); } initFrameAnim() { if (!this.useStates) return; this.frameAnim[this.STATES.NORMAL] = this.parseFrameAnim(this.frame_normal); this.frameAnim[this.STATES.HOVER] = this.parseFrameAnim(this.frame_hover, { "f": null, "a": null }); this.frameAnim[this.STATES.CLICKED] = this.parseFrameAnim(this.frame_clicked, { "f": null, "a": null }); this.frameAnim[this.STATES.DISABLED] = this.parseFrameAnim(this.frame_disabled); this.frameAnim[this.STATES.FOCUSED] = this.parseFrameAnim(this.frame_focus, { "f": null, "a": null }); } setFrameAnim(state) { if (!this.useStates) { return; } var frame, anim; if (this.isFocused) { if (this.state == this.STATES.NORMAL) { frame = (this.frameAnim[this.STATES.FOCUSED]["f"] === null) ? this.frameAnim[this.STATES.NORMAL]["f"] : this.frameAnim[this.STATES.FOCUSED]["f"]; anim = this.frameAnim[this.STATES.FOCUSED]["a"] || this.frameAnim[this.STATES.NORMAL]["a"]; } else { if (this.frameAnim[state]["f"] == null && !this.frameAnim[state]["a"]) { frame = this.frameAnim[this.STATES.NORMAL]["f"]; anim = this.frameAnim[this.STATES.NORMAL]["a"]; } else { frame = (this.frameAnim[state]["f"] === null) ? this.frameAnim[this.STATES.FOCUSED]["f"] : this.frameAnim[state]["f"]; anim = this.frameAnim[state]["a"] || this.frameAnim[this.STATES.FOCUSED]["a"]; } } } else { frame = this.frameAnim[state]["f"]; anim = this.frameAnim[state]["a"]; } if (anim) { this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnim, anim, 0); } if (frame !== null) { this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnimFrame, frame, 0); } } initAnimations() { this.currentDelta = { x: 0, y: 0, width: 0, height: 0 }; this.targetDelta = { x: 0, y: 0, width: 0, height: 0 }; this.tween = new Tween["Tween"](this.currentDelta); } setAnimations(type) { this.prev = { x: this.currentDelta.x, y: this.currentDelta.y, width: this.currentDelta.width, height: this.currentDelta.height }; if (type == 1) { this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 200); } else if (type == 2) { this.tween["easing"](Tween["Easing"]["Elastic"]["Out"])["to"](this.targetDelta, 500); } else if (type == 3) { this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100); } else if (type == 4) { this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100); } else if (type == 5) { this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100); } else if (type == 6) { this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100); } } getTargetDelta(type, state) { var wi = this.wi; var t = { x: 0, y: 0, width: 0, height: 0 }; var f = 0.1; if (state == "click") { f = this.clickAnimationFactor; } else if (state == "hover") { f = this.hoverAnimationFactor; } else if (state == "focus") { f = this.focusAnimationFactor; } if (type == 1 || type == 2) { t.width = wi.GetWidth() * f; t.height = wi.GetHeight() * f; } else if (type == 3) { t.y = wi.GetHeight() * f; } else if (type == 4) { t.y = -wi.GetHeight() * f; } else if (type == 5) { t.x = -wi.GetWidth() * f; } else if (type == 6) { t.x = wi.GetWidth() * f; } return t; } OnAnyInputDown(x, y) { if (this.wi.ContainsPoint(x, y)) { this.OnInputDown(x, y); } } OnAnyInputMove(x, y) { if (this.isOnMobile) return; if (this.wi.ContainsPoint(x, y)) { if (!this.isMouseEnter) { this.OnMouseEnter(x, y); } } else { if (this.isMouseEnter) { this.OnMouseLeave(); } } } setFocused(isFocused) { if (!this.isEnabled) return; if (isFocused == this.isFocused) return; this.isFocused = isFocused; if (isFocused) { this.setFrameAnim(this.state); this.setColor(this.state); this.audioSources.focus.play(); if (this.focusAnimation > 0) { this.tween["stop"](); this.targetDelta_focus = this.getTargetDelta(this.focusAnimation, "focus"); this.targetDelta.width += this.targetDelta_focus.width; this.targetDelta.height += this.targetDelta_focus.height; this.targetDelta.x += this.targetDelta_focus.x; this.targetDelta.y += this.targetDelta_focus.y; this.setAnimations(this.focusAnimation); ;this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } if (this.OnFocusedC) this.OnFocusedC(); } else { this.setFrameAnim(this.STATES.NORMAL); this.setColor(this.STATES.NORMAL); this.setFrameAnim(this.state); this.setColor(this.state); if (this.focusAnimation > 0) { this.tween["stop"](); this.targetDelta.width -= this.targetDelta_focus.width; this.targetDelta.height -= this.targetDelta_focus.height; this.targetDelta.x -= this.targetDelta_focus.x; this.targetDelta.y -= this.targetDelta_focus.y; this.setAnimations(this.focusAnimation); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } if (this.OnUnFocusedC) this.OnUnFocusedC(); } } OnMouseEnter(x, y) { if (!this.isClickable(x, y)) return; if (this.isTouchStarted) return; this.isMouseEnter = true; this.state = this.STATES.HOVER; this.setFrameAnim(this.state); this.setColor(this.state); this.audioSources.hover.play(); if (this.OnMouseEnterC) this.OnMouseEnterC(); if (this.hoverAnimation > 0) { var wi = this.wi; this.tween["stop"](); this.targetDelta_hover = this.getTargetDelta(this.hoverAnimation, "hover"); this.targetDelta.width += this.targetDelta_hover.width; this.targetDelta.height += this.targetDelta_hover.height; this.targetDelta.x += this.targetDelta_hover.x; this.targetDelta.y += this.targetDelta_hover.y; this.setAnimations(this.hoverAnimation); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } } async OnInputDown(x, y) { var res = await this.isOnMovingScrollView(); if (res) return; if (!this.isClickable(x, y) || this.isTouchStarted) return; this.isTouchStarted = true; if (this.clickAnimation > 0) { this.tween["stop"](); this.targetDelta_click = this.getTargetDelta(this.clickAnimation, "click"); this.targetDelta.width += this.targetDelta_click.width; this.targetDelta.height += this.targetDelta_click.height; this.targetDelta.x += this.targetDelta_click.x; this.targetDelta.y += this.targetDelta_click.y; this.setAnimations(this.clickAnimation); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } if (!this.isFocused && this.focusAnimation > 0) { this.tween["stop"](); this.targetDelta_focus = this.getTargetDelta(this.focusAnimation, "focus"); this.targetDelta.width += this.targetDelta_focus.width; this.targetDelta.height += this.targetDelta_focus.height; this.targetDelta.x += this.targetDelta_focus.x; this.targetDelta.y += this.targetDelta_focus.y; this.setAnimations(this.focusAnimation); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } if (!this.isFocused) { if (this.OnFocusedC) this.OnFocusedC(); } this.isFocused = true; this.state = this.STATES.CLICKED; this.setFrameAnim(this.state); this.setColor(this.state); this.audioSources.click.play(); } OnAnyInputUp(x, y) { if (!this.isTouchStarted) return; this.isTouchStarted = false; if (this.clickAnimation > 0 && this.state != this.STATES.NORMAL) { this.tween["stop"](); this.targetDelta.width -= this.targetDelta_click.width; this.targetDelta.height -= this.targetDelta_click.height; this.targetDelta.x -= this.targetDelta_click.x; this.targetDelta.y -= this.targetDelta_click.y; this.setAnimations(this.clickAnimation); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } if (this.wi.ContainsPoint(x, y)) { if (this.isOnMobile) { this.state = this.STATES.NORMAL; } else { this.state = this.STATES.HOVER; } this.Callbacks(); } else { this.state = this.STATES.NORMAL; } this.setFrameAnim(this.state); this.setColor(this.state); } Callbacks() { for (var i = 0, l = this.callbacks.length; i < l; i++) { this.callbacks[i](); } if (this.OnAnyInputUpC) this.OnAnyInputUpC(); } OnMouseLeave() { this.isMouseEnter = false; if (this.state != this.STATES.DISABLED) { this.state = this.STATES.NORMAL; } this.setFrameAnim(this.state); this.setColor(this.state); if (this.hoverAnimation > 0) { this.targetDelta.width -= this.targetDelta_hover.width; this.targetDelta.height -= this.targetDelta_hover.height; this.targetDelta.x -= this.targetDelta_hover.x; this.targetDelta.y -= this.targetDelta_hover.y; } if (this.clickAnimation > 0 && this.isTouchStarted) { this.targetDelta.width -= this.targetDelta_click.width; this.targetDelta.height -= this.targetDelta_click.height; this.targetDelta.x -= this.targetDelta_click.x; this.targetDelta.y -= this.targetDelta_click.y; } if (this.hoverAnimation > 0 || (this.clickAnimation > 0 && this.isTouchStarted)) { this.tween["stop"](); this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"])["to"](this.targetDelta, 100); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } if (this.OnMouseLeaveC) this.OnMouseLeaveC(); } setIgnoreInput(state) { this.ignoreInput = state; } Tick() { if (this.updateV) { this.updateView(); this._StopTicking(); this.updateV = false; return; } if (this.isTweenPlaying) { this.isTweenPlaying = false; } if (this.tween["isPlaying"]) { this.tween["update"](this.GetRuntime().GetWallTime() * 1000); this.isTweenPlaying = true; } if (this.isTweenPlaying) { var wi = this.wi; this.wi.OffsetXY(this.currentDelta.x - this.prev.x, this.currentDelta.y - this.prev.y); this.wi.SetSize(wi.GetWidth() + this.currentDelta.width - this.prev.width, wi.GetHeight() + this.currentDelta.height - this.prev.height); this.wi.SetBboxChanged(); this.prev = { x: this.currentDelta.x, y: this.currentDelta.y, width: this.currentDelta.width, height: this.currentDelta.height }; } else { this._StopTicking(); } } isClickable(x, y) { if (x === undefined || y === undefined) { x = this.wi.GetBoundingBox().getLeft() + 10; y = this.wi.GetBoundingBox().getTop() + 10; } if (this.ignoreInput === 1 || this.proui.ignoreInput) { return false; } var isVisible = (this.wi.GetLayer().IsVisible() && this.wi.IsVisible()); var isInsideScrollView = this.isInsideScrollView(x, y); var isUnder = false; if (this.ignoreInput === 2 && this.aekiro_dialogManager) { isUnder = this.aekiro_dialogManager.isInstanceUnder(this.wi.GetLayer().GetIndex()); } return this.isEnabled && isVisible && !isUnder && isInsideScrollView; } isInsideScrollView(x, y) { var insideScrollView = true; var scrollView = this.scrollViews["l" + this.inst.GetWorldInfo().GetLayer().GetIndex()]; if (scrollView) { insideScrollView = scrollView.GetWorldInfo().ContainsPoint(x, y); } return insideScrollView; } isOnMovingScrollView() { var scrollView = this.scrollViews["l" + this.inst.GetWorldInfo().GetLayer().GetIndex()]; if (scrollView) { return new Promise(resolve=>{ setTimeout(()=>{ if (scrollView.GetUnsavedDataMap().aekiro_scrollView.isMoving()) { console.log("moving"); resolve(true); } else { resolve(false); } } , 10); } ); } else { return false; } } Release() { super.Release(); } } ; globalThis.Aekiro.button.Cnds = { OnMouseEnter() { return true; }, OnMouseLeave() { return true; }, IsEnabled() { return this.isEnabled; }, IsClickable() { return this.isClickable(); }, OnFocused() { return true; }, OnUnFocused() { return true; }, IsFocused() { return this.isFocused; }, OnClicked() { return true; } }; globalThis.Aekiro.button.Acts = { setEnabled(isEnabled) { this.setEnabled(isEnabled); }, SetFocused(v) { this.setFocused(v); }, SetIgnoreInput(s) { this.setIgnoreInput(s); }, SetClickSoundVolume(v) { this.audioSources.click.setVolume(v); }, SetHoverSoundVolume(v) { this.audioSources.hover.setVolume(v); }, SimulateClick() { if (this.isTouchStarted) return; var x = this.wi.GetBoundingBox().getLeft() + 10; var y = this.wi.GetBoundingBox().getTop() + 10; this.OnInputDown(x, y); setTimeout(()=>{ x = this.wi.GetBoundingBox().getLeft() - 50; y = this.wi.GetBoundingBox().getTop() - 50; this.OnAnyInputUp(x, y); this.Callbacks(); } , 100); }, setNormalFrame(v) { this.frame_normal = v; this.initFrameAnim(); this.setFrameAnim(this.state); }, setHoverFrame(v) { this.frame_hover = v; this.initFrameAnim(); }, setClickedFrame(v) { this.frame_clicked = v; this.initFrameAnim(); }, setDisabledFrame(v) { this.frame_disabled = v; this.initFrameAnim(); }, setFocusFrame(v) { this.frame_focus = v; this.initFrameAnim(); }, setClickAnimation(v) { this.clickAnimation = v; this.initAnimations(); }, setHoverAnimation(v) { this.hoverAnimation = v; this.initAnimations(); }, setFocusAnimation(v) { this.focusAnimation = v; this.initAnimations(); }, setNormalColor(v) { this.color_normal = v; this.initColors(); }, setHoverColor(v) { this.color_hover = v; this.initColors(); }, setClickedColor(v) { this.color_clicked = v; this.initColors(); }, setFocusColor(v) { this.color_focus = v; this.initColors(); } }; globalThis.Aekiro.checkbox = class aekiro_checkbox extends globalThis.Aekiro.button { constructor(behInst, properties) { super(behInst, properties); } checkbox_constructor() { this.button_constructor(); this.frameAnim = [[], []]; } initFrameAnim() { this.useStates = true; if (!this.isInstanceOfSprite || (this.frame_normal == "" && this.frame_hover == "" && this.frame_disabled == "")) { this.useStates = false; return; } this.cur_AnimationFrame = this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationFrame); this.cur_AnimationName = this.sdkInstance.CallExpression(this.sdkInstance_exps.AnimationName); var f = this.frame_normal.split(','); this.frameAnim[0][this.STATES.NORMAL] = this.parseFrameAnim(f[0]); this.frameAnim[1][this.STATES.NORMAL] = this.parseFrameAnim(f[1]); f = this.frame_hover.split(','); this.frameAnim[0][this.STATES.HOVER] = this.parseFrameAnim(f[0], { "f": null, "a": null }); this.frameAnim[1][this.STATES.HOVER] = this.parseFrameAnim(f[1], { "f": null, "a": null }); f = this.frame_disabled.split(','); this.frameAnim[0][this.STATES.DISABLED] = this.parseFrameAnim(f[0]); this.frameAnim[1][this.STATES.DISABLED] = this.parseFrameAnim(f[1]); f = this.frame_focus.split(','); this.frameAnim[0][this.STATES.FOCUSED] = this.parseFrameAnim(f[0], { "f": null, "a": null }); this.frameAnim[1][this.STATES.FOCUSED] = this.parseFrameAnim(f[1], { "f": null, "a": null }); } setFrameAnim(state) { if (!this.useStates) { return; } if (state == this.STATES.CLICKED) state = this.STATES.NORMAL; var v = this.value ? 1 : 0; var frame, anim; if (this.isFocused) { if (this.state == this.STATES.NORMAL) { frame = (this.frameAnim[v][this.STATES.FOCUSED]["f"] === null) ? this.frameAnim[v][this.STATES.NORMAL]["f"] : this.frameAnim[v][this.STATES.FOCUSED]["f"]; anim = this.frameAnim[v][this.STATES.FOCUSED]["a"] || this.frameAnim[v][this.STATES.NORMAL]["a"]; } else { if (this.frameAnim[v][state]["f"] == null && !this.frameAnim[v][state]["a"]) { frame = this.frameAnim[v][this.STATES.NORMAL]["f"]; anim = this.frameAnim[v][this.STATES.NORMAL]["a"]; } else { frame = (this.frameAnim[v][state]["f"] === null) ? this.frameAnim[v][this.STATES.FOCUSED]["f"] : this.frameAnim[v][state]["f"]; anim = this.frameAnim[v][state]["a"] || this.frameAnim[v][this.STATES.FOCUSED]["a"]; } } } else { frame = this.frameAnim[v][state]["f"]; anim = this.frameAnim[v][state]["a"]; } if (anim) { this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnim, anim, 0); } if (frame !== null) { this.sdkInstance.CallAction(this.sdkInstance_acts.SetAnimFrame, frame, 0); } } initColors() { this.cur_color = this.wi.GetUnpremultipliedColor(); this.colors = [[], []]; var c; c = this.color_normal.split(';'); this.colors[0][this.STATES.NORMAL] = this.parseColor(c[0]); this.colors[1][this.STATES.NORMAL] = this.parseColor(c[1], this.colors[0][this.STATES.NORMAL]); c = this.color_hover.split(';'); this.colors[0][this.STATES.HOVER] = this.parseColor(c[0], null); this.colors[1][this.STATES.HOVER] = this.parseColor(c[1], this.colors[0][this.STATES.HOVER]); c = this.color_clicked.split(';'); this.colors[0][this.STATES.CLICKED] = this.parseColor(c[0], null); this.colors[1][this.STATES.CLICKED] = this.parseColor(c[1], this.colors[0][this.STATES.CLICKED]); c = this.color_disabled.split(';'); this.colors[0][this.STATES.DISABLED] = this.parseColor(c[0]); this.colors[1][this.STATES.DISABLED] = this.parseColor(c[1]), this.colors[0][this.STATES.DISABLED]; c = this.color_focus.split(';'); this.colors[0][this.STATES.FOCUSED] = this.parseColor(c[0], null); this.colors[1][this.STATES.FOCUSED] = this.parseColor(c[1], this.colors[0][this.STATES.FOCUSED]); } setColor(state) { var v = this.value ? 1 : 0; var color; if (this.isFocused) { if (this.state == this.STATES.NORMAL) { color = this.colors[v][this.STATES.FOCUSED] || this.colors[v][this.STATES.NORMAL]; } else { color = this.colors[v][state] || this.colors[v][this.STATES.FOCUSED]; if (!this.colors[v][state] && !this.colors[v][this.STATES.FOCUSED]) { color = this.colors[v][this.STATES.NORMAL]; } } } else { color = this.colors[v][state]; } if (color) { this.wi.SetUnpremultipliedColor(color); this.wi.SetBboxChanged(); } } isValueValid(value) { if (value == null || value === "") { return false; } return true; } setValue(value) { value = !!value; value = value ? 1 : 0; if (this.value != value) { this.value = value; this.setFrameAnim(this.state); this.setColor(this.state); } } } ; globalThis.aekiro_scrollViewManager = { scrollViews: {}, add: function(inst) { this.scrollViews["l" + inst.GetWorldInfo().GetLayer().GetIndex()] = inst; }, remove: function(inst) { for (var key in this.scrollViews) { if (this.scrollViews[key] == inst) { delete this.scrollViews[key]; } } }, isOverlaped: function(inst, x, y) { var n = inst.GetRuntime().GetMainRunningLayout().GetLayerCount(); var scrollView; var isOverlaped = false; for (var i = inst.GetWorldInfo().GetLayer().GetIndex() + 1, l = n; i < l; i++) { scrollView = this.scrollViews["l" + i]; if (scrollView) { if (!scrollView.GetWorldInfo().GetLayer().IsVisible()) { continue; } if (scrollView.GetWorldInfo().ContainsPoint(x, y)) { isOverlaped = true; break; } } } return isOverlaped; } }; globalThis.aekiro_dialogManager = { currentDialogs: [], addDialog: function(inst) { this.currentDialogs.push(inst); }, removeDialog: function(inst) { var i = this.currentDialogs.indexOf(inst); if (i != -1) { this.currentDialogs.splice(i, 1); } }, isDialogOpened: function() { return this.currentDialogs.length; }, isModalDialogOpened: function() { for (var i = 0; i < this.currentDialogs.length; i++) { if (this.currentDialogs[i].GetUnsavedDataMap().aekiro_dialog.isModal) { return true; } } return false; }, isInstanceUnder: function(layerIndex) { for (var i = 0, l = this.currentDialogs.length; i < l; i++) { if (layerIndex < this.currentDialogs[i].GetWorldInfo().GetLayer().GetIndex()) { return true; } } return false; } }; "use strict"; { C3.Plugins.aekiro_proui.Cnds = { IsDialogOpened() { return globalThis.aekiro_dialogManager.isDialogOpened(); }, OnAnyButtonClicked() { return true; } }; } "use strict"; { C3.Plugins.aekiro_proui.Acts = { SetInputIgnored(state) { this.ignoreInput = state; }, Clone(json, layer, x, y, name, parentName) { json = JSON.parse(json); var inst = this.aekiro_goManager.clone(json, name, parentName, layer, x, y); inst.GetUnsavedDataMap().aekiro_gameobject.updateZindex(); }, SetUIAudioVolume(v) { this.setUIAudioVolume(v); }, Init() { this.Initialise(); } }; } "use strict"; { C3.Plugins.aekiro_proui.Exps = {}; } 'use strict'; { const C3 = self.C3; C3.Plugins.Touch = class TouchPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Touch.Type = class TouchType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} GetScriptInterfaceClass() { return self.ITouchObjectType } } ; let touchObjectType = null; function GetTouchSdkInstance() { return touchObjectType.GetSingleGlobalInstance().GetSdkInstance() } self.ITouchObjectType = class ITouchObjectType extends self.IObjectClass { constructor(objectType) { super(objectType); touchObjectType = objectType; objectType.GetRuntime()._GetCommonScriptInterfaces().touch = this } requestPermission(type) { const touchInst = GetTouchSdkInstance(); if (type === "orientation") return touchInst._RequestPermission(0); else if (type === "motion") return touchInst._RequestPermission(1); else throw new Error("invalid type"); } } } ;'use strict'; { const C3 = self.C3; const DOM_COMPONENT_ID = "touch"; C3.Plugins.Touch.Instance = class TouchInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst, DOM_COMPONENT_ID); this._touches = new Map; this._useMouseInput = false; this._isMouseDown = false; this._orientCompassHeading = 0; this._orientAlpha = 0; this._orientBeta = 0; this._orientGamma = 0; this._accX = 0; this._accY = 0; this._accZ = 0; this._accWithGX = 0; this._accWithGY = 0; this._accWithGZ = 0; this._triggerIndex = 0; this._triggerId = 0; this._triggerPermission = 0; this._curTouchX = 0; this._curTouchY = 0; this._getTouchIndex = 0; this._permissionPromises = []; if (properties) this._useMouseInput = properties[0]; this.AddDOMMessageHandler("permission-result", e=>this._OnPermissionResult(e)); const rt = this.GetRuntime().Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "pointerdown", e=>this._OnPointerDown(e.data)),C3.Disposable.From(rt, "pointermove", e=>this._OnPointerMove(e.data)),C3.Disposable.From(rt, "pointerup", e=>this._OnPointerUp(e.data, false)),C3.Disposable.From(rt, "pointercancel", e=>this._OnPointerUp(e.data, true)),C3.Disposable.From(rt, "deviceorientation", e=>this._OnDeviceOrientation(e.data)),C3.Disposable.From(rt, "deviceorientationabsolute", e=>this._OnDeviceOrientationAbsolute(e.data)),C3.Disposable.From(rt, "devicemotion", e=>this._OnDeviceMotion(e.data)),C3.Disposable.From(rt, "tick2", e=>this._OnTick2())) } Release() { this._touches.clear(); super.Release() } _OnPointerDown(e) { if (e["pointerType"] === "mouse") if (this._useMouseInput) this._isMouseDown = true; else return; const pointerId = e["pointerId"]; if (this._touches.has(pointerId)) return; const x = e["pageX"] - this._runtime.GetCanvasClientX(); const y = e["pageY"] - this._runtime.GetCanvasClientY(); const nowTime = e["timeStamp"]; const index = this._touches.size; this._triggerIndex = index; this._triggerId = pointerId; const touchInfo = C3.New(C3.Plugins.Touch.TouchInfo); touchInfo.Init(nowTime, x, y, pointerId, index); this._touches.set(pointerId, touchInfo); this.Trigger(C3.Plugins.Touch.Cnds.OnNthTouchStart); this.Trigger(C3.Plugins.Touch.Cnds.OnTouchStart); this._curTouchX = x; this._curTouchY = y; this.Trigger(C3.Plugins.Touch.Cnds.OnTouchObject) } _OnPointerMove(e) { if (e["pointerType"] === "mouse" && !this._isMouseDown) return; const touchInfo = this._touches.get(e["pointerId"]); if (!touchInfo) return; const nowTime = e["timeStamp"]; if (nowTime - touchInfo.GetTime() < 2) return; const x = e["pageX"] - this._runtime.GetCanvasClientX(); const y = e["pageY"] - this._runtime.GetCanvasClientY(); touchInfo.Update(nowTime, x, y, e["width"], e["height"], e["pressure"]) } _OnPointerUp(e, isCancel) { if (e["pointerType"] === "mouse") if (this._isMouseDown) this._isMouseDown = false; else return; const nowTime = e["timeStamp"]; const pointerId = e["pointerId"]; const touchInfo = this._touches.get(pointerId); if (!touchInfo) return; this._triggerIndex = touchInfo.GetStartIndex(); this._triggerId = touchInfo.GetId(); this.Trigger(C3.Plugins.Touch.Cnds.OnNthTouchEnd); this.Trigger(C3.Plugins.Touch.Cnds.OnTouchEnd); if (!isCancel) { const tap = touchInfo.ShouldTriggerTap(nowTime); if (tap === "single-tap") { this.Trigger(C3.Plugins.Touch.Cnds.OnTapGesture); this._curTouchX = touchInfo.GetX(); this._curTouchY = touchInfo.GetY(); this.Trigger(C3.Plugins.Touch.Cnds.OnTapGestureObject) } else if (tap === "double-tap") { this.Trigger(C3.Plugins.Touch.Cnds.OnDoubleTapGesture); this._curTouchX = touchInfo.GetX(); this._curTouchY = touchInfo.GetY(); this.Trigger(C3.Plugins.Touch.Cnds.OnDoubleTapGestureObject) } } touchInfo.Release(); this._touches.delete(pointerId) } _RequestPermission(type) { this._PostToDOMMaybeSync("request-permission", { "type": type }); return new Promise((resolve,reject)=>{ this._permissionPromises.push({ type, resolve, reject }) } ) } _OnPermissionResult(e) { const isGranted = e["result"]; const type = e["type"]; this._triggerPermission = type; const toResolve = this._permissionPromises.filter(o=>o.type === type); for (const o of toResolve) o.resolve(isGranted ? "granted" : "denied"); this._permissionPromises = this._permissionPromises.filter(o=>o.type !== type); if (isGranted) { this.Trigger(C3.Plugins.Touch.Cnds.OnPermissionGranted); if (type === 0) this._runtime.RequestDeviceOrientationEvent(); else this._runtime.RequestDeviceMotionEvent() } else this.Trigger(C3.Plugins.Touch.Cnds.OnPermissionDenied) } _OnDeviceOrientation(e) { if (typeof e["webkitCompassHeading"] === "number") this._orientCompassHeading = e["webkitCompassHeading"]; else if (e["absolute"]) this._orientCompassHeading = e["alpha"]; this._orientAlpha = e["alpha"]; this._orientBeta = e["beta"]; this._orientGamma = e["gamma"] } _OnDeviceOrientationAbsolute(e) { this._orientCompassHeading = e["alpha"] } _OnDeviceMotion(e) { const acc = e["acceleration"]; if (acc) { this._accX = acc["x"]; this._accY = acc["y"]; this._accZ = acc["z"] } const withG = e["accelerationIncludingGravity"]; if (withG) { this._accWithGX = withG["x"]; this._accWithGY = withG["y"]; this._accWithGZ = withG["z"] } } _OnTick2() { const nowTime = performance.now(); let index = 0; for (const touchInfo of this._touches.values()) { if (touchInfo.GetTime() <= nowTime - 50) touchInfo._SetLastTime(nowTime); if (touchInfo.ShouldTriggerHold(nowTime)) { this._triggerIndex = touchInfo.GetStartIndex(); this._triggerId = touchInfo.GetId(); this._getTouchIndex = index; this.Trigger(C3.Plugins.Touch.Cnds.OnHoldGesture); this._curTouchX = touchInfo.GetX(); this._curTouchY = touchInfo.GetY(); this.Trigger(C3.Plugins.Touch.Cnds.OnHoldGestureObject); this._getTouchIndex = 0 } ++index } } _GetTouchByIndex(index) { index = Math.floor(index); for (const touchInfo of this._touches.values()) { if (index === 0) return touchInfo; --index } return null } _IsClientPosOnCanvas(touchX, touchY) { return touchX >= 0 && touchY >= 0 && touchX < this._runtime.GetCanvasCssWidth() && touchY < this._runtime.GetCanvasCssHeight() } GetDebuggerProperties() { const prefix = "plugins.touch.debugger"; return [{ title: prefix + ".touches", properties: [...this._touches.values()].map(ti=>({ name: "$" + ti.GetId(), value: ti.GetX() + ", " + ti.GetY() })) }] } } } ;'use strict'; { const C3 = self.C3; const tempArr = []; C3.Plugins.Touch.Cnds = { OnTouchStart() { return true }, OnTouchEnd() { return true }, IsInTouch() { return this._touches.size > 0 }, OnTouchObject(objectClass) { if (!objectClass) return false; if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY)) return false; return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false) }, IsTouchingObject(objectClass) { if (!objectClass) return false; const sol = objectClass.GetCurrentSol(); const instances = sol.GetInstances(); for (const inst of instances) { const wi = inst.GetWorldInfo(); const layer = wi.GetLayer(); for (const touchInfo of this._touches.values()) { if (!this._IsClientPosOnCanvas(touchInfo.GetX(), touchInfo.GetY())) continue; const [px,py] = layer.CanvasCssToLayer(touchInfo.GetX(), touchInfo.GetY(), wi.GetTotalZElevation()); if (wi.ContainsPoint(px, py)) { tempArr.push(inst); break } } } if (tempArr.length) { sol.SetArrayPicked(tempArr); objectClass.ApplySolToContainer(); C3.clearArray(tempArr); return true } else return false }, CompareTouchSpeed(index, cmp, s) { const touchInfo = this._GetTouchByIndex(index); if (!touchInfo) return false; return C3.compare(touchInfo.GetSpeed(), cmp, s) }, OrientationSupported() { return true }, MotionSupported() { return true }, CompareOrientation(orientation, cmp, a) { this._runtime.RequestDeviceOrientationEvent(); let v = 0; if (orientation === 0) v = this._orientAlpha; else if (orientation === 1) v = this._orientBeta; else v = this._orientGamma; return C3.compare(v, cmp, a) }, CompareAcceleration(a, cmp, x) { this._runtime.RequestDeviceMotionEvent(); let v = 0; if (a === 0) v = this._accWithGX; else if (a === 1) v = this._accWithGY; else if (a === 2) v = this._accWithGZ; else if (a === 3) v = this._accX; else if (a === 4) v = this._accY; else v = this._accZ; return C3.compare(v, cmp, x) }, OnNthTouchStart(index) { index = Math.floor(index); return index === this._triggerIndex }, OnNthTouchEnd(index) { index = Math.floor(index); return index === this._triggerIndex }, HasNthTouch(index) { index = Math.floor(index); return this._touches.size >= index + 1 }, OnHoldGesture() { return true }, OnTapGesture() { return true }, OnDoubleTapGesture() { return true }, OnHoldGestureObject(objectClass) { if (!objectClass) return false; if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY)) return false; return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false) }, OnTapGestureObject(objectClass) { if (!objectClass) return false; if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY)) return false; return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false) }, OnDoubleTapGestureObject(objectClass) { if (!objectClass) return false; if (!this._IsClientPosOnCanvas(this._curTouchX, this._curTouchY)) return false; return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, this._curTouchX, this._curTouchY, false) }, OnPermissionGranted(type) { return this._triggerPermission === type }, OnPermissionDenied(type) { return this._triggerPermission === type } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Touch.Acts = { RequestPermission(type) { this._RequestPermission(type) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Touch.Exps = { TouchCount() { return this._touches.size }, X(layerParam) { const touchInfo = this._GetTouchByIndex(this._getTouchIndex); if (!touchInfo) return 0; return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, true) }, Y(layerParam) { const touchInfo = this._GetTouchByIndex(this._getTouchIndex); if (!touchInfo) return 0; return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, false) }, XAt(index, layerParam) { const touchInfo = this._GetTouchByIndex(index); if (!touchInfo) return 0; return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, true) }, YAt(index, layerParam) { const touchInfo = this._GetTouchByIndex(index); if (!touchInfo) return 0; return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, false) }, XForID(id, layerParam) { const touchInfo = this._touches.get(id); if (!touchInfo) return 0; return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, true) }, YForID(id, layerParam) { const touchInfo = this._touches.get(id); if (!touchInfo) return 0; return touchInfo.GetPositionForLayer(this._runtime.GetCurrentLayout(), layerParam, false) }, AbsoluteX() { const touchInfo = this._GetTouchByIndex(0); if (touchInfo) return touchInfo.GetX(); else return 0 }, AbsoluteY() { const touchInfo = this._GetTouchByIndex(0); if (touchInfo) return touchInfo.GetY(); else return 0 }, AbsoluteXAt(index) { const touchInfo = this._GetTouchByIndex(index); if (touchInfo) return touchInfo.GetX(); else return 0 }, AbsoluteYAt(index) { const touchInfo = this._GetTouchByIndex(index); if (touchInfo) return touchInfo.GetY(); else return 0 }, AbsoluteXForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return touchInfo.GetX(); else return 0 }, AbsoluteYForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return touchInfo.GetY(); else return 0 }, SpeedAt(index) { const touchInfo = this._GetTouchByIndex(index); if (touchInfo) return touchInfo.GetSpeed(); else return 0 }, SpeedForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return touchInfo.GetSpeed(); else return 0 }, AngleAt(index) { const touchInfo = this._GetTouchByIndex(index); if (touchInfo) return C3.toDegrees(touchInfo.GetAngle()); else return 0 }, AngleForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return C3.toDegrees(touchInfo.GetAngle()); else return 0 }, CompassHeading() { this._runtime.RequestDeviceOrientationEvent(); return this._orientCompassHeading }, Alpha() { this._runtime.RequestDeviceOrientationEvent(); return this._orientAlpha }, Beta() { this._runtime.RequestDeviceOrientationEvent(); return this._orientBeta }, Gamma() { this._runtime.RequestDeviceOrientationEvent(); return this._orientGamma }, AccelerationXWithG() { this._runtime.RequestDeviceMotionEvent(); return this._accWithGX }, AccelerationYWithG() { this._runtime.RequestDeviceMotionEvent(); return this._accWithGY }, AccelerationZWithG() { this._runtime.RequestDeviceMotionEvent(); return this._accWithGZ }, AccelerationX() { this._runtime.RequestDeviceMotionEvent(); return this._accX }, AccelerationY() { this._runtime.RequestDeviceMotionEvent(); return this._accY }, AccelerationZ() { this._runtime.RequestDeviceMotionEvent(); return this._accZ }, TouchIndex() { return this._triggerIndex }, TouchID() { return this._triggerId }, WidthForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return touchInfo.GetWidth(); else return 0 }, HeightForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return touchInfo.GetHeight(); else return 0 }, PressureForID(id) { const touchInfo = this._touches.get(id); if (touchInfo) return touchInfo.GetPressure(); else return 0 } } } ;'use strict'; { const C3 = self.C3; const GESTURE_HOLD_THRESHOLD = 15; const GESTURE_HOLD_TIMEOUT = 500; const GESTURE_TAP_TIMEOUT = 333; const GESTURE_DOUBLETAP_THRESHOLD = 25; let lastTapX = -1E3; let lastTapY = -1E3; let lastTapTime = -1E4; C3.Plugins.Touch.TouchInfo = class TouchInfo extends C3.DefendedBase { constructor() { super(); this._pointerId = 0; this._startIndex = 0; this._startTime = 0; this._time = 0; this._lastTime = 0; this._startX = 0; this._startY = 0; this._x = 0; this._y = 0; this._lastX = 0; this._lastY = 0; this._width = 0; this._height = 0; this._pressure = 0; this._hasTriggeredHold = false; this._isTooFarForHold = false } Release() {} Init(nowTime, x, y, id, index) { this._pointerId = id; this._startIndex = index; this._time = nowTime; this._lastTime = nowTime; this._startTime = nowTime; this._startX = x; this._startY = y; this._x = x; this._y = y; this._lastX = x; this._lastY = y } Update(nowTime, x, y, width, height, pressure) { this._lastTime = this._time; this._time = nowTime; this._lastX = this._x; this._lastY = this._y; this._x = x; this._y = y; this._width = width; this._height = height; this._pressure = pressure; if (!this._isTooFarForHold && C3.distanceTo(this._startX, this._startY, this._x, this._y) >= GESTURE_HOLD_THRESHOLD) this._isTooFarForHold = true } GetId() { return this._pointerId } GetStartIndex() { return this._startIndex } GetTime() { return this._time } _SetLastTime(t) { this._lastTime = t } GetX() { return this._x } GetY() { return this._y } GetSpeed() { const dist = C3.distanceTo(this._x, this._y, this._lastX, this._lastY); const dt = (this._time - this._lastTime) / 1E3; if (dt > 0) return dist / dt; else return 0 } GetAngle() { return C3.angleTo(this._lastX, this._lastY, this._x, this._y) } GetWidth() { return this._width } GetHeight() { return this._height } GetPressure() { return this._pressure } ShouldTriggerHold(nowTime) { if (this._hasTriggeredHold) return false; if (nowTime - this._startTime >= GESTURE_HOLD_TIMEOUT && !this._isTooFarForHold && C3.distanceTo(this._startX, this._startY, this._x, this._y) < GESTURE_HOLD_THRESHOLD) { this._hasTriggeredHold = true; return true } return false } ShouldTriggerTap(nowTime) { if (this._hasTriggeredHold) return ""; if (nowTime - this._startTime <= GESTURE_TAP_TIMEOUT && !this._isTooFarForHold && C3.distanceTo(this._startX, this._startY, this._x, this._y) < GESTURE_HOLD_THRESHOLD) if (nowTime - lastTapTime <= GESTURE_TAP_TIMEOUT * 2 && C3.distanceTo(lastTapX, lastTapY, this._x, this._y) < GESTURE_DOUBLETAP_THRESHOLD) { lastTapX = -1E3; lastTapY = -1E3; lastTapTime = -1E4; return "double-tap" } else { lastTapX = this._x; lastTapY = this._y; lastTapTime = nowTime; return "single-tap" } return "" } GetPositionForLayer(layout, layerNameOrNumber, getx) { if (typeof layerNameOrNumber === "undefined") { const layer = layout.GetLayerByIndex(0); return layer.CanvasCssToLayer_DefaultTransform(this._x, this._y)[getx ? 0 : 1] } else { const layer = layout.GetLayer(layerNameOrNumber); if (layer) return layer.CanvasCssToLayer(this._x, this._y)[getx ? 0 : 1]; else return 0 } } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Mouse = class MousePlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Mouse.Type = class MouseType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} GetScriptInterfaceClass() { return self.IMouseObjectType } } ; let mouseObjectType = null; function GetMouseSdkInstance() { return mouseObjectType.GetSingleGlobalInstance().GetSdkInstance() } self.IMouseObjectType = class IMouseObjectType extends self.IObjectClass { constructor(objectType) { super(objectType); mouseObjectType = objectType; objectType.GetRuntime()._GetCommonScriptInterfaces().mouse = this } getMouseX(layerNameOrNumber) { return GetMouseSdkInstance().GetMousePositionForLayer(layerNameOrNumber)[0] } getMouseY(layerNameOrNumber) { return GetMouseSdkInstance().GetMousePositionForLayer(layerNameOrNumber)[1] } getMousePosition(layerNameOrNumber) { return GetMouseSdkInstance().GetMousePositionForLayer(layerNameOrNumber) } isMouseButtonDown(button) { return GetMouseSdkInstance().IsMouseButtonDown(button) } } } ;'use strict'; { const C3 = self.C3; const DOM_COMPONENT_ID = "mouse"; C3.Plugins.Mouse.Instance = class MouseInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst, DOM_COMPONENT_ID); this._buttonMap = [false, false, false]; this._mouseXcanvas = 0; this._mouseYcanvas = 0; this._triggerButton = 0; this._triggerType = 0; this._triggerDir = 0; const rt = this.GetRuntime().Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "pointermove", e=>this._OnPointerMove(e.data)),C3.Disposable.From(rt, "pointerdown", e=>this._OnPointerDown(e.data)),C3.Disposable.From(rt, "pointerup", e=>this._OnPointerUp(e.data)),C3.Disposable.From(rt, "dblclick", e=>this._OnDoubleClick(e.data)),C3.Disposable.From(rt, "wheel", e=>this._OnMouseWheel(e.data)),C3.Disposable.From(rt, "window-blur", ()=>this._OnWindowBlur())) } Release() { super.Release() } _OnPointerDown(e) { if (e["pointerType"] !== "mouse") return; this._mouseXcanvas = e["pageX"] - this._runtime.GetCanvasClientX(); this._mouseYcanvas = e["pageY"] - this._runtime.GetCanvasClientY(); this._CheckButtonChanges(e["lastButtons"], e["buttons"]) } _OnPointerMove(e) { if (e["pointerType"] !== "mouse") return; this._mouseXcanvas = e["pageX"] - this._runtime.GetCanvasClientX(); this._mouseYcanvas = e["pageY"] - this._runtime.GetCanvasClientY(); this._CheckButtonChanges(e["lastButtons"], e["buttons"]) } _OnPointerUp(e) { if (e["pointerType"] !== "mouse") return; this._CheckButtonChanges(e["lastButtons"], e["buttons"]) } _CheckButtonChanges(lastButtons, buttons) { this._CheckButtonChange(lastButtons, buttons, 1, 0); this._CheckButtonChange(lastButtons, buttons, 4, 1); this._CheckButtonChange(lastButtons, buttons, 2, 2) } _CheckButtonChange(lastButtons, buttons, checkButtonFlag, resultButton) { if (!(lastButtons & checkButtonFlag) && buttons & checkButtonFlag) this._OnMouseDown(resultButton); else if (lastButtons & checkButtonFlag && !(buttons & checkButtonFlag)) this._OnMouseUp(resultButton) } _OnMouseDown(button) { this._buttonMap[button] = true; this.Trigger(C3.Plugins.Mouse.Cnds.OnAnyClick); this._triggerButton = button; this._triggerType = 0; this.Trigger(C3.Plugins.Mouse.Cnds.OnClick); this.Trigger(C3.Plugins.Mouse.Cnds.OnObjectClicked) } _OnMouseUp(button) { if (!this._buttonMap[button]) return; this._buttonMap[button] = false; this._triggerButton = button; this.Trigger(C3.Plugins.Mouse.Cnds.OnRelease) } _OnDoubleClick(e) { this._triggerButton = e["button"]; this._triggerType = 1; this.Trigger(C3.Plugins.Mouse.Cnds.OnClick); this.Trigger(C3.Plugins.Mouse.Cnds.OnObjectClicked) } _OnMouseWheel(e) { this._triggerDir = e["deltaY"] < 0 ? 1 : 0; this.Trigger(C3.Plugins.Mouse.Cnds.OnWheel) } _OnWindowBlur() { for (let i = 0, len = this._buttonMap.length; i < len; ++i) { if (!this._buttonMap[i]) return; this._buttonMap[i] = false; this._triggerButton = i; this.Trigger(C3.Plugins.Mouse.Cnds.OnRelease) } } GetMousePositionForLayer(layerNameOrNumber) { const layout = this._runtime.GetMainRunningLayout(); const x = this._mouseXcanvas; const y = this._mouseYcanvas; if (typeof layerNameOrNumber === "undefined") { const layer = layout.GetLayerByIndex(0); return layer.CanvasCssToLayer_DefaultTransform(x, y) } else { const layer = layout.GetLayer(layerNameOrNumber); if (layer) return layer.CanvasCssToLayer(x, y); else return [0, 0] } } IsMouseButtonDown(button) { button = Math.floor(button); return !!this._buttonMap[button] } _IsMouseOverCanvas() { return this._mouseXcanvas >= 0 && this._mouseYcanvas >= 0 && this._mouseXcanvas < this._runtime.GetCanvasCssWidth() && this._mouseYcanvas < this._runtime.GetCanvasCssHeight() } GetDebuggerProperties() { const prefix = "plugins.mouse"; return [{ title: prefix + ".name", properties: [{ name: prefix + ".debugger.absolute-position", value: this._mouseXcanvas + "," + this._mouseYcanvas }, { name: prefix + ".debugger.left-button", value: this._buttonMap[0] }, { name: prefix + ".debugger.middle-button", value: this._buttonMap[1] }, { name: prefix + ".debugger.right-button", value: this._buttonMap[2] }] }, { title: prefix + ".debugger.position-on-each-layer", properties: this._runtime.GetMainRunningLayout().GetLayers().map(layer=>({ name: "$" + layer.GetName(), value: layer.CanvasCssToLayer(this._mouseXcanvas, this._mouseYcanvas).join(", ") })) }] } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Mouse.Cnds = { OnClick(button, type) { return this._triggerButton === button && this._triggerType === type }, OnAnyClick() { return true }, IsButtonDown(button) { return this._buttonMap[button] }, OnRelease(button) { return this._triggerButton === button }, IsOverObject(objectClass) { if (!this._IsMouseOverCanvas()) return false; const cnd = this._runtime.GetCurrentCondition(); const isInverted = cnd.IsInverted(); const mx = this._mouseXcanvas; const my = this._mouseYcanvas; return C3.xor(this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, mx, my, isInverted), isInverted) }, OnObjectClicked(button, type, objectClass) { if (button !== this._triggerButton || type !== this._triggerType) return false; if (!this._IsMouseOverCanvas()) return false; const mx = this._mouseXcanvas; const my = this._mouseYcanvas; return this._runtime.GetCollisionEngine().TestAndSelectCanvasPointOverlap(objectClass, mx, my, false) }, OnWheel(dir) { return this._triggerDir === dir } } } ;'use strict'; { const C3 = self.C3; let lastSetCursor = null; const CURSOR_STYLES = ["auto", "pointer", "text", "crosshair", "move", "help", "wait", "none"]; C3.Plugins.Mouse.Acts = { SetCursor(c) { const cursorStyle = CURSOR_STYLES[c]; if (lastSetCursor === cursorStyle) return; lastSetCursor = cursorStyle; this.PostToDOM("cursor", cursorStyle) }, SetCursorSprite(objectClass) { if (C3.Platform.IsMobile || !objectClass) return; const inst = objectClass.GetFirstPicked(); if (!inst) return; const wi = inst.GetWorldInfo(); const imageInfo = inst.GetCurrentImageInfo(); if (!wi || !imageInfo) return; if (lastSetCursor === imageInfo) return; lastSetCursor = imageInfo; imageInfo.ExtractImageToCanvas().then(canvas=>C3.CanvasToBlob(canvas)).then(blob=>{ const url = URL.createObjectURL(blob); const cursorStyle = `url(${url}) ${Math.round(wi.GetOriginX() * imageInfo.GetWidth())} ${Math.round(wi.GetOriginY() * imageInfo.GetHeight())}, auto`; this.PostToDOM("cursor", ""); this.PostToDOM("cursor", cursorStyle) } ) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Mouse.Exps = { X(layerParam) { return this.GetMousePositionForLayer(layerParam)[0] }, Y(layerParam) { return this.GetMousePositionForLayer(layerParam)[1] }, AbsoluteX() { return this._mouseXcanvas }, AbsoluteY() { return this._mouseYcanvas } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Keyboard = class KeyboardPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Keyboard.Type = class KeyboardType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} GetScriptInterfaceClass() { return self.IKeyboardObjectType } } ; let keyboardObjectType = null; function GetKeyboardSdkInstance() { return keyboardObjectType.GetSingleGlobalInstance().GetSdkInstance() } self.IKeyboardObjectType = class IKeyboardObjectType extends self.IObjectClass { constructor(objectType) { super(objectType); keyboardObjectType = objectType; objectType.GetRuntime()._GetCommonScriptInterfaces().keyboard = this } isKeyDown(keyOrCode) { const keyboardInst = GetKeyboardSdkInstance(); if (typeof keyOrCode === "string") return keyboardInst.IsKeyDown(keyOrCode); else if (typeof keyOrCode === "number") return keyboardInst.IsKeyCodeDown(keyOrCode); else throw new TypeError("expected string or number"); } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Keyboard.Instance = class KeyboardInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this._keysDownByString = new Set; this._keysDownByWhich = new Set; this._triggerWhich = 0; this._triggerString = ""; this._triggerTypedKey = ""; const rt = this.GetRuntime().Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "keydown", e=>this._OnKeyDown(e.data)),C3.Disposable.From(rt, "keyup", e=>this._OnKeyUp(e.data)),C3.Disposable.From(rt, "window-blur", ()=>this._OnWindowBlur())) } Release() { super.Release() } _OnKeyDown(e) { const which = e["which"]; const keyString = e["code"] || which.toString(); const typedKey = e["key"]; if (this._keysDownByString.has(keyString)) return; this._keysDownByString.add(keyString); this._keysDownByWhich.add(which); this._triggerString = keyString; this._triggerWhich = which; this._triggerTypedKey = typedKey; this.Trigger(C3.Plugins.Keyboard.Cnds.OnAnyKey); this.Trigger(C3.Plugins.Keyboard.Cnds.OnKey); this.Trigger(C3.Plugins.Keyboard.Cnds.OnLeftRightKeyPressed); this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyCode) } _OnKeyUp(e) { const which = e["which"]; const keyString = e["code"] || which.toString(); const typedKey = e["key"]; this._keysDownByString.delete(keyString); this._keysDownByWhich.delete(which); this._triggerString = keyString; this._triggerWhich = which; this._triggerTypedKey = typedKey; this.Trigger(C3.Plugins.Keyboard.Cnds.OnAnyKeyReleased); this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyReleased); this.Trigger(C3.Plugins.Keyboard.Cnds.OnLeftRightKeyReleased); this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyCodeReleased) } _OnWindowBlur() { for (const which of this._keysDownByWhich) { this._keysDownByWhich.delete(which); this._triggerWhich = which; this.Trigger(C3.Plugins.Keyboard.Cnds.OnAnyKeyReleased); this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyReleased); this.Trigger(C3.Plugins.Keyboard.Cnds.OnKeyCodeReleased) } this._keysDownByString.clear() } IsKeyDown(str) { return this._keysDownByString.has(str) } IsKeyCodeDown(which) { return this._keysDownByWhich.has(which) } SaveToJson() { return { "tk": this._triggerWhich, "tkk": this._triggerTypedKey } } LoadFromJson(o) { this._triggerWhich = o["tk"]; if (o.hasOwnProperty("tkk")) this._triggerTypedKey = o["tkk"] } GetDebuggerProperties() { const prefix = "plugins.keyboard"; return [{ title: prefix + ".name", properties: [{ name: prefix + ".debugger.last-key-code", value: this._triggerWhich }, { name: prefix + ".debugger.last-key-string", value: C3.Plugins.Keyboard.Exps.StringFromKeyCode(this._triggerWhich) }, { name: prefix + ".debugger.last-typed-key", value: this._triggerTypedKey }] }] } } } ;'use strict'; { const C3 = self.C3; const LEFTRIGHT_KEY_STRINGS = ["ShiftLeft", "ShiftRight", "ControlLeft", "ControlRight", "AltLeft", "AltRight", "MetaLeft", "MetaRight"]; C3.Plugins.Keyboard.Cnds = { IsKeyDown(which) { return this._keysDownByWhich.has(which) }, OnKey(which) { return this._triggerWhich === which }, OnAnyKey() { return true }, OnAnyKeyReleased() { return true }, OnKeyReleased(which) { return this._triggerWhich === which }, IsKeyCodeDown(which) { which = Math.floor(which); return this._keysDownByWhich.has(which) }, OnKeyCode(which) { return this._triggerWhich === which }, OnKeyCodeReleased(which) { return this._triggerWhich === which }, OnLeftRightKeyPressed(index) { const keyString = LEFTRIGHT_KEY_STRINGS[index]; return this._triggerString === keyString }, OnLeftRightKeyReleased(index) { const keyString = LEFTRIGHT_KEY_STRINGS[index]; return this._triggerString === keyString }, IsLeftRightKeyDown(index) { const keyString = LEFTRIGHT_KEY_STRINGS[index]; return this._keysDownByString.has(keyString) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Keyboard.Acts = {} } ;'use strict'; { const C3 = self.C3; function StringFromCharCode(kc) { kc = Math.floor(kc); switch (kc) { case 8: return "backspace"; case 9: return "tab"; case 13: return "enter"; case 16: return "shift"; case 17: return "control"; case 18: return "alt"; case 19: return "pause"; case 20: return "capslock"; case 27: return "esc"; case 33: return "pageup"; case 34: return "pagedown"; case 35: return "end"; case 36: return "home"; case 37: return "\u2190"; case 38: return "\u2191"; case 39: return "\u2192"; case 40: return "\u2193"; case 45: return "insert"; case 46: return "del"; case 91: return "left window key"; case 92: return "right window key"; case 93: return "select"; case 96: return "numpad 0"; case 97: return "numpad 1"; case 98: return "numpad 2"; case 99: return "numpad 3"; case 100: return "numpad 4"; case 101: return "numpad 5"; case 102: return "numpad 6"; case 103: return "numpad 7"; case 104: return "numpad 8"; case 105: return "numpad 9"; case 106: return "numpad *"; case 107: return "numpad +"; case 109: return "numpad -"; case 110: return "numpad ."; case 111: return "numpad /"; case 112: return "F1"; case 113: return "F2"; case 114: return "F3"; case 115: return "F4"; case 116: return "F5"; case 117: return "F6"; case 118: return "F7"; case 119: return "F8"; case 120: return "F9"; case 121: return "F10"; case 122: return "F11"; case 123: return "F12"; case 144: return "numlock"; case 145: return "scroll lock"; case 186: return ";"; case 187: return "="; case 188: return ","; case 189: return "-"; case 190: return "."; case 191: return "/"; case 192: return "'"; case 219: return "["; case 220: return "\\"; case 221: return "]"; case 222: return "#"; case 223: return "`"; default: return String.fromCharCode(kc) } } C3.Plugins.Keyboard.Exps = { LastKeyCode() { return this._triggerWhich }, StringFromKeyCode(kc) { return StringFromCharCode(kc) }, TypedKey() { return this._triggerTypedKey } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Browser = class BrowserPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Browser.Type = class BrowserType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const DOM_COMPONENT_ID = "browser"; C3.Plugins.Browser.Instance = class BrowserInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst, DOM_COMPONENT_ID); this._initLocationStr = ""; this._isOnline = false; this._referrer = ""; this._docTitle = ""; this._isCookieEnabled = false; this._screenWidth = 0; this._screenHeight = 0; this._windowOuterWidth = 0; this._windowOuterHeight = 0; this._isScirraArcade = false; this.AddDOMMessageHandlers([["online-state", e=>this._OnOnlineStateChanged(e)], ["backbutton", ()=>this._OnBackButton()], ["sw-message", e=>this._OnSWMessage(e)], ["hashchange", e=>this._OnHashChange(e)]]); const rt = this.GetRuntime().Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "afterfirstlayoutstart", ()=>this._OnAfterFirstLayoutStart()),C3.Disposable.From(rt, "window-resize", ()=>this._OnWindowResize()),C3.Disposable.From(rt, "suspend", ()=>this._OnSuspend()),C3.Disposable.From(rt, "resume", ()=>this._OnResume())); this._runtime.AddLoadPromise(this.PostToDOMAsync("get-initial-state", { "exportType": this._runtime.GetExportType() }).then(data=>{ this._initLocationStr = data["location"]; this._isOnline = data["isOnline"]; this._referrer = data["referrer"]; this._docTitle = data["title"]; this._isCookieEnabled = data["isCookieEnabled"]; this._screenWidth = data["screenWidth"]; this._screenHeight = data["screenHeight"]; this._windowOuterWidth = data["windowOuterWidth"]; this._windowOuterHeight = data["windowOuterHeight"]; this._isScirraArcade = data["isScirraArcade"] } )) } Release() { super.Release() } _OnAfterFirstLayoutStart() { this.PostToDOM("ready-for-sw-messages") } async _OnOnlineStateChanged(e) { const isOnline = !!e["isOnline"]; if (this._isOnline === isOnline) return; this._isOnline = isOnline; if (this._isOnline) await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnOnline); else await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnOffline) } async _OnWindowResize() { await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnResize) } _OnSuspend() { this.Trigger(C3.Plugins.Browser.Cnds.OnPageHidden) } _OnResume() { this.Trigger(C3.Plugins.Browser.Cnds.OnPageVisible) } async _OnBackButton() { await this.TriggerAsync(C3.Plugins.Browser.Cnds.OnBackButton) } _OnSWMessage(e) { const messageType = e["type"]; if (messageType === "downloading-update") this.Trigger(C3.Plugins.Browser.Cnds.OnUpdateFound); else if (messageType === "update-ready" || messageType === "update-pending") this.Trigger(C3.Plugins.Browser.Cnds.OnUpdateReady); else if (messageType === "offline-ready") this.Trigger(C3.Plugins.Browser.Cnds.OnOfflineReady) } _OnHashChange(e) { this._initLocationStr = e["location"]; this.Trigger(C3.Plugins.Browser.Cnds.OnHashChange) } GetDebuggerProperties() { const prefix = "plugins.browser.debugger"; return [{ title: "plugins.browser.name", properties: [{ name: prefix + ".user-agent", value: navigator.userAgent }, { name: prefix + ".is-online", value: this._isOnline }, { name: prefix + ".is-fullscreen", value: this._runtime.GetCanvasManager().IsDocumentFullscreen() }] }] } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Browser.Cnds = { IsOnline() { return this._isOnline }, OnOnline() { return true }, OnOffline() { return true }, OnResize() { return true }, CookiesEnabled() { return this._isCookieEnabled }, IsFullscreen() { return this._runtime.GetCanvasManager().IsDocumentFullscreen() }, OnBackButton() { return true }, IsPortraitLandscape(p) { const lastInnerWidth = this._runtime.GetCanvasManager().GetLastWidth(); const lastInnerHeight = this._runtime.GetCanvasManager().GetLastHeight(); const current = lastInnerWidth <= lastInnerHeight ? 0 : 1; return current === p }, OnUpdateFound() { return true }, OnUpdateReady() { return true }, OnOfflineReady() { return true }, OnHashChange() { return true }, PageVisible() { return !this._runtime.IsSuspended() }, OnPageHidden() { return true }, OnPageVisible() { return true }, HasJava() { return false }, IsDownloadingUpdate() { return false }, OnMenuButton() { return false }, OnSearchButton() { return false }, IsMetered() { return false }, IsCharging() { return true }, SupportsFullscreen() { return true } } } ;'use strict'; { const C3 = self.C3; const ORIENTATIONS = ["portrait", "landscape", "portrait-primary", "portrait-secondary", "landscape-primary", "landscape-secondary"]; C3.Plugins.Browser.Acts = { Alert(message) { this.PostToDOM("alert", { "message": message.toString() }) }, Close() { if (this._isScirraArcade) return; if (this._runtime.IsDebug()) self.C3Debugger.CloseWindow(); else this.PostToDOM("close") }, Focus() { this.PostToDOM("set-focus", { "isFocus": true }) }, Blur() { this.PostToDOM("set-focus", { "isFocus": false }) }, GoBack() { if (this._isScirraArcade) return; this.PostToDOM("navigate", { "type": "back" }) }, GoForward() { if (this._isScirraArcade) return; this.PostToDOM("navigate", { "type": "forward" }) }, GoHome() { if (this._isScirraArcade) return; this.PostToDOM("navigate", { "type": "home" }) }, Reload() { if (this._isScirraArcade) return; if (this._runtime.IsDebug()) this._runtime.PostToDebugger({ "type": "reload" }); else this.PostToDOM("navigate", { "type": "reload" }) }, GoToURL(url, target) { this._PostToDOMMaybeSync("navigate", { "type": "url", "url": "?"+url, "target": target, "exportType": this._runtime.GetExportType() }) }, GoToURLWindow(url, tag) { this._PostToDOMMaybeSync("navigate", { "type": "new-window", "url": url, "tag": tag, "exportType": this._runtime.GetExportType() }) }, RequestFullScreen(mode, navUi) { if (mode >= 2) mode += 1; if (mode === 6) mode = 2; if (mode === 1) mode = 0; const modeStr = C3.CanvasManager._FullscreenModeNumberToString(mode); this._runtime.GetCanvasManager().SetDocumentFullscreenMode(modeStr); this._PostToDOMMaybeSync("request-fullscreen", { "navUI": navUi }) }, CancelFullScreen() { this._PostToDOMMaybeSync("exit-fullscreen") }, Vibrate(pattern) { const arr = pattern.split(","); for (let i = 0, len = arr.length; i < len; ++i) arr[i] = parseInt(arr[i], 10); this._PostToDOMMaybeSync("vibrate", { "pattern": arr }) }, async InvokeDownload(url, filename) { if (!filename) return; const urlToDownload = await this._runtime.GetAssetManager().GetProjectFileUrl(url); this._runtime.InvokeDownload(urlToDownload, filename) }, InvokeDownloadString(str, mimeType, filename) { if (!filename) return; const dataUri = `data:${mimeType},${encodeURIComponent(str)}`; this._runtime.InvokeDownload(dataUri, filename) }, ConsoleLog(type, msg) { msg = msg.toString(); if (type === 0) console.log(msg); else if (type === 1) console.warn(msg); else if (type === 2) console.error(msg) }, ConsoleGroup(name) { console.group(name) }, ConsoleGroupEnd() { console.groupEnd() }, ExecJs(jsStr) { try { console.log("--fx--eval--", jsStr); // eval(jsStr) } catch (err) { console.error("Error executing JavaScript: ", err) } }, LockOrientation(o) { o = Math.floor(o); if (o < 0 || o >= ORIENTATIONS.length) return; const orientation = ORIENTATIONS[o]; this._PostToDOMMaybeSync("lock-orientation", { "orientation": orientation }) }, UnlockOrientation() { this._PostToDOMMaybeSync("unlock-orientation") }, LoadStyleSheet(url) { this._runtime.GetAssetManager().LoadStyleSheet(url) }, SetHash(h) { this.PostToDOM("set-hash", { "hash": h }) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Browser.Exps = { URL() { if (this._runtime.IsInWorker()) return this._initLocationStr; else return location.toString() }, Protocol() { if (this._runtime.IsInWorker()) return (new URL(this._initLocationStr)).protocol; else return location.protocol }, Domain() { return "games-online.io"; console.log("--fx--host--", location.hostname); console.log("--fx--host--", (new URL(this._initLocationStr)).hostname); if (this._runtime.IsInWorker()) return (new URL(this._initLocationStr)).hostname; else return location.hostname }, Port() { if (this._runtime.IsInWorker()) return (new URL(this._initLocationStr)).port; else return location.port }, PathName() { if (this._runtime.IsInWorker()) return (new URL(this._initLocationStr)).pathname; else return location.pathname }, Hash() { if (this._runtime.IsInWorker()) return (new URL(this._initLocationStr)).hash; else return location.hash }, QueryString() { if (this._runtime.IsInWorker()) return (new URL(this._initLocationStr)).search; else return location.search }, QueryParam(param) { const search = this._runtime.IsInWorker() ? (new URL(this._initLocationStr)).search : location.search; const match = RegExp("[?&]" + param + "=([^&]*)").exec(search); if (match) return decodeURIComponent(match[1].replace(/\+/g, " ")); else return "" }, Referrer() { return this._referrer }, Title() { return this._docTitle }, Language() { return navigator.language }, Platform() { return navigator.platform }, UserAgent() { return navigator.userAgent }, ExecJS(jsStr) { let result = 0; try { result = eval(jsStr) } catch (err) { console.error("Error executing JavaScript: ", err) } if (typeof result === "number" || typeof result === "string") return result; if (typeof result === "boolean") return result ? 1 : 0; else return 0 }, Name() { return navigator.appName }, Version() { return navigator.appVersion }, Product() { return navigator.product }, Vendor() { return navigator.vendor }, BatteryLevel() { return 1 }, BatteryTimeLeft() { return Infinity }, Bandwidth() { const connection = navigator["connection"]; if (connection) return connection["downlink"] || connection["downlinkMax"] || connection["bandwidth"] || Infinity; else return Infinity }, ConnectionType() { const connection = navigator["connection"]; if (connection) return connection["type"] || "unknown"; else return "unknown" }, DevicePixelRatio() { return self.devicePixelRatio }, ScreenWidth() { return this._screenWidth }, ScreenHeight() { return this._screenHeight }, WindowInnerWidth() { return this._runtime.GetCanvasManager().GetLastWidth() }, WindowInnerHeight() { return this._runtime.GetCanvasManager().GetLastHeight() }, WindowOuterWidth() { return this._windowOuterWidth }, WindowOuterHeight() { return this._windowOuterWidth } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TiledBg = class TiledBgPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; function WrapModeToStr(wrapMode) { switch (wrapMode) { case 0: return "clamp-to-edge"; case 1: return "repeat"; case 2: return "mirror-repeat" } return "repeat" } C3.Plugins.TiledBg.Type = class TiledBgType extends C3.SDKTypeBase { constructor(objectClass, exportData) { super(objectClass); this._wrapX = "repeat"; this._wrapY = "repeat"; if (exportData) { this._wrapX = WrapModeToStr(exportData[0]); this._wrapY = WrapModeToStr(exportData[1]) } } Release() { super.Release() } OnCreate() { this.GetImageInfo().LoadAsset(this._runtime) } LoadTextures(renderer) { return this.GetImageInfo().LoadStaticTexture(renderer, { sampling: this._runtime.GetSampling(), wrapX: this._wrapX, wrapY: this._wrapY }) } ReleaseTextures() { this.GetImageInfo().ReleaseTexture() } } } ;'use strict'; { const C3 = self.C3; const INITIALLY_VISIBLE = 0; const ORIGIN = 1; const IMAGE_OFFSET_X = 4; const IMAGE_OFFSET_Y = 5; const IMAGE_SCALE_X = 6; const IMAGE_SCALE_Y = 7; const IMAGE_ANGLE = 8; const tempRect = C3.New(C3.Rect); const tempQuad = C3.New(C3.Quad); const rcTex = C3.New(C3.Rect); const qTex = C3.New(C3.Quad); C3.Plugins.TiledBg.Instance = class TiledBgInstance extends C3.SDKWorldInstanceBase { constructor(inst, properties) { super(inst); this._imageOffsetX = 0; this._imageOffsetY = 0; this._imageScaleX = 1; this._imageScaleY = 1; this._imageAngle = 0; this._ownImageInfo = null; if (properties) { this.GetWorldInfo().SetVisible(!!properties[INITIALLY_VISIBLE]); this._imageOffsetX = properties[IMAGE_OFFSET_X]; this._imageOffsetY = properties[IMAGE_OFFSET_Y]; this._imageScaleX = properties[IMAGE_SCALE_X]; this._imageScaleY = properties[IMAGE_SCALE_Y]; this._imageAngle = C3.toRadians(properties[IMAGE_ANGLE]) } } Release() { this._ReleaseOwnImage(); super.Release() } _ReleaseOwnImage() { if (this._ownImageInfo) { this._ownImageInfo.Release(); this._ownImageInfo = null } } Draw(renderer) { const imageInfo = this.GetCurrentImageInfo(); const texture = imageInfo.GetTexture(); if (texture === null) return; renderer.SetTexture(texture); const imageWidth = imageInfo.GetWidth(); const imageHeight = imageInfo.GetHeight(); const imageOffsetX = this._imageOffsetX / imageWidth; const imageOffsetY = this._imageOffsetY / imageHeight; const wi = this.GetWorldInfo(); rcTex.set(0, 0, wi.GetWidth() / (imageWidth * this._imageScaleX), wi.GetHeight() / (imageHeight * this._imageScaleY)); rcTex.offset(-imageOffsetX, -imageOffsetY); if (wi.HasMesh()) this._DrawMesh(wi, renderer); else this._DrawStandard(wi, renderer) } _DrawStandard(wi, renderer) { let quad = wi.GetBoundingQuad(); if (this._runtime.IsPixelRoundingEnabled()) quad = wi.PixelRoundQuad(quad); if (this._imageAngle === 0) renderer.Quad3(quad, rcTex); else { qTex.setFromRotatedRect(rcTex, -this._imageAngle); renderer.Quad4(quad, qTex) } } _DrawMesh(wi, renderer) { const transformedMesh = wi.GetTransformedMesh(); if (wi.IsMeshChanged()) { wi.CalculateBbox(tempRect, tempQuad, false); let quad = tempQuad; if (this._runtime.IsPixelRoundingEnabled()) quad = wi.PixelRoundQuad(quad); let texCoords = rcTex; if (this._imageAngle !== 0) { qTex.setFromRotatedRect(rcTex, -this._imageAngle); texCoords = qTex } transformedMesh.CalculateTransformedMesh(wi.GetSourceMesh(), quad, texCoords); wi.SetMeshChanged(false) } transformedMesh.Draw(renderer) } GetCurrentImageInfo() { return this._ownImageInfo || this._objectClass.GetImageInfo() } _SetMeshChanged() { this.GetWorldInfo().SetMeshChanged(true) } _SetImageOffsetX(x) { if (this._imageOffsetX === x) return; this._imageOffsetX = x; this._runtime.UpdateRender(); this._SetMeshChanged() } _GetImageOffsetX() { return this._imageOffsetX } _SetImageOffsetY(y) { if (this._imageOffsetY === y) return; this._imageOffsetY = y; this._runtime.UpdateRender(); this._SetMeshChanged() } _GetImageOffsetY() { return this._imageOffsetY } _SetImageScaleX(x) { if (this._imageScaleX === x) return; this._imageScaleX = x; this._runtime.UpdateRender(); this._SetMeshChanged() } _GetImageScaleX() { return this._imageScaleX } _SetImageScaleY(y) { if (this._imageScaleY === y) return; this._imageScaleY = y; this._runtime.UpdateRender(); this._SetMeshChanged() } _GetImageScaleY() { return this._imageScaleY } _SetImageAngle(a) { if (this._imageAngle === a) return; this._imageAngle = a; this._runtime.UpdateRender(); this._SetMeshChanged() } _GetImageAngle() { return this._imageAngle } GetPropertyValueByIndex(index) { switch (index) { case IMAGE_OFFSET_X: return this._GetImageOffsetX(); case IMAGE_OFFSET_Y: return this._GetImageOffsetY(); case IMAGE_SCALE_X: return this._GetImageScaleX(); case IMAGE_SCALE_Y: return this._GetImageScaleY(); case IMAGE_ANGLE: return this._GetImageAngle() } } SetPropertyValueByIndex(index, value) { switch (index) { case IMAGE_OFFSET_X: this._SetImageOffsetX(value); break; case IMAGE_OFFSET_Y: this._SetImageOffsetY(value); break; case IMAGE_SCALE_X: this._SetImageScaleX(value); break; case IMAGE_SCALE_Y: this._SetImageScaleY(value); break; case IMAGE_ANGLE: this._SetImageAngle(value); break } } GetScriptInterfaceClass() { return self.ITiledBackgroundInstance } } ; const map = new WeakMap; self.ITiledBackgroundInstance = class ITiledBackgroundInstance extends self.IWorldInstance { constructor() { super(); map.set(this, self.IInstance._GetInitInst().GetSdkInstance()) } set imageOffsetX(x) { map.get(this)._SetImageOffsetX(x) } get imageOffsetX() { return map.get(this)._GetImageOffsetX() } set imageOffsetY(y) { map.get(this)._SetImageOffsetY(y) } get imageOffsetY() { return map.get(this)._GetImageOffsetY() } set imageScaleX(x) { map.get(this)._SetImageScaleX(x) } get imageScaleX() { return map.get(this)._GetImageScaleX() } set imageScaleY(y) { map.get(this)._SetImageScaleY(y) } get imageScaleY() { return map.get(this)._GetImageScaleY() } set imageAngle(a) { map.get(this)._SetImageAngle(a) } get imageAngle() { return map.get(this)._GetImageAngle() } set imageAngleDegrees(a) { map.get(this)._SetImageAngle(C3.toRadians(a)) } get imageAngleDegrees() { return C3.toDegrees(map.get(this)._GetImageAngle()) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TiledBg.Cnds = { OnURLLoaded() { return true }, OnURLFailed() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TiledBg.Acts = { SetImageOffsetX(x) { this._SetImageOffsetX(x) }, SetImageOffsetY(y) { this._SetImageOffsetY(y) }, SetImageScaleX(x) { this._SetImageScaleX(x / 100) }, SetImageScaleY(y) { this._SetImageScaleY(y / 100) }, SetImageAngle(a) { this._SetImageAngle(C3.toRadians(a)) }, SetEffect(effect) { this.GetWorldInfo().SetBlendMode(effect); this._runtime.UpdateRender() }, async LoadURL(url, crossOrigin) { if (this._ownImageInfo && this._ownImageInfo.GetURL() === url) return; const runtime = this._runtime; const imageInfo = C3.New(C3.ImageInfo); await imageInfo.LoadDynamicAsset(runtime, url); if (!imageInfo.IsLoaded()) { this.Trigger(C3.Plugins.TiledBg.Cnds.OnURLFailed); return } if (this.WasReleased()) { imageInfo.Release(); return null } const texture = await imageInfo.LoadStaticTexture(runtime.GetWebGLRenderer(), { sampling: this._runtime.GetSampling(), wrapX: "repeat", wrapY: "repeat" }); if (!texture) return; if (this.WasReleased()) { imageInfo.Release(); return } this._ReleaseOwnImage(); this._ownImageInfo = imageInfo; runtime.UpdateRender(); await this.TriggerAsync(C3.Plugins.TiledBg.Cnds.OnURLLoaded) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TiledBg.Exps = { ImageWidth() { return this.GetCurrentImageInfo().GetWidth() }, ImageHeight() { return this.GetCurrentImageInfo().GetHeight() }, ImageOffsetX() { return this._imageOffsetX }, ImageOffsetY() { return this._imageOffsetY }, ImageScaleX() { return this._imageScaleX * 100 }, ImageScaleY() { return this._imageScaleY * 100 }, ImageAngle() { return C3.toDegrees(this._imageAngle) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.DrawingCanvas = class DrawingCanvasPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.DrawingCanvas.Type = class DrawingCanvasType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const INITIALLY_VISIBLE = 0; const ORIGIN = 1; const MULTISAMPLING = 2; const tempColor = C3.New(C3.Color); let drawDepth = 0; C3.Plugins.DrawingCanvas.Instance = class DrawingCanvasInstance extends C3.SDKWorldInstanceBase { constructor(inst, properties) { super(inst); this._renderTarget = null; this._rcTex = C3.New(C3.Rect); this._multisampling = 0; this._texRenderTarget = null; this._drawCommands = []; this._currentPoly = []; this._drawBlendMode = 0; this._drawScale = 1; this._texScale = 1; this._lineDashTexture = null; this._savedImageUrl = ""; this._snapshot = null; this._tempRect = C3.New(C3.Rect); this._tempQuad = C3.New(C3.Quad); if (properties) { this.GetWorldInfo().SetVisible(!!properties[INITIALLY_VISIBLE]); this._multisampling = [0, 2, 4, 8][properties[MULTISAMPLING]] } const renderer = this._runtime.GetWebGLRenderer(); this._SetDrawingBlendMode(0); if (renderer.GetWebGLVersionNumber() < 2) this._multisampling = 0; this._StartTicking2() } Release() { if (this._renderTarget) { this._renderTarget.GetWebGLRenderer().DeleteRenderTarget(this._renderTarget); this._renderTarget = null } if (this._texRenderTarget) { this._texRenderTarget.GetWebGLRenderer().DeleteRenderTarget(this._texRenderTarget); this._texRenderTarget = null } C3.clearArray(this._drawCommands); super.Release() } _ClonePoly() { return this._currentPoly.map(p=>p.slice(0)) } _GetLineDashTexture() { this._MaybeCreateLineDashTexture(); return this._lineDashTexture } _MaybeCreateLineDashTexture() { if (this._lineDashTexture) return; const canvas = C3.CreateCanvas(512, 8); const ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, 512, 8); ctx.fillStyle = "white"; ctx.fillRect(0, 0, 256, 8); this._lineDashTexture = this._runtime.GetWebGLRenderer().CreateStaticTexture(canvas, { wrapX: "repeat", sampling: this._runtime.GetSampling() }) } _SetDrawingBlendMode(bm) { this._drawBlendMode = bm } _ApplyCurrentDrawingBlendMode(renderer) { renderer.SetBlendMode(this._drawBlendMode) } _AddDrawCommand(cmd) { this._drawCommands.push(cmd); this._runtime.UpdateRender() } _UpdateRenderTargetSize(renderer, rtWidth, rtHeight) { if (this._renderTarget) renderer.DeleteRenderTarget(this._renderTarget); this._renderTarget = renderer.CreateRenderTarget({ width: rtWidth, height: rtHeight, sampling: this._runtime.GetSampling(), readback: this._multisampling === 0, multisampling: this._multisampling }); if (this._multisampling > 0) { if (this._texRenderTarget) renderer.DeleteRenderTarget(this._texRenderTarget); this._texRenderTarget = renderer.CreateRenderTarget({ width: rtWidth, height: rtHeight, sampling: this._runtime.GetSampling(), readback: true }) } renderer.SetTexture(null) } _GetRenderTarget() { return this._renderTarget } _GetTexRenderTarget() { return this._texRenderTarget } GetMultisampling() { return this._multisampling } _SetRenderTargetDeviceTransform(renderer) { this._runtime.GetCanvasManager().SetDeviceTransform(renderer, this._renderTarget.GetWidth(), this._renderTarget.GetHeight()) } HasAnyDrawingCommandInQueue() { return this._drawCommands.some(c=>!(c instanceof C3.Plugins.DrawingCanvas.DrawCommand.SaveImage)) } Tick2() { const renderer = this._runtime.GetWebGLRenderer(); const wi = this.GetWorldInfo(); const layer = wi.GetLayer(); const layout = layer.GetLayout(); const tempQuad = this._tempQuad; const tempRect = this._tempRect; ++drawDepth; const angle = wi.GetAngle(); const layerAngle = layer.GetOwnAngle(); const layoutAngle = layout.GetAngle(); if (angle !== 0 || layerAngle !== 0 || layoutAngle !== 0) { layout.SetAngle(0); layer.SetAngle(0); wi.SetAngle(0); wi.SetBboxChanged() } const quad = wi.GetBoundingQuad(); const [dl,dt] = layer.LayerToDrawSurface(quad.getTlx(), quad.getTly()); const [dr,db] = layer.LayerToDrawSurface(quad.getBrx(), quad.getBry()); const offX = dl - Math.round(dl); const offY = dt - Math.round(dt); tempRect.set(dl, dt, dr, db); tempRect.offset(-offX, -offY); tempRect.normalize(); tempQuad.setFromRect(tempRect); if (angle !== 0 || layerAngle !== 0 || layoutAngle !== 0) { layout.SetAngle(layoutAngle); layer.SetAngle(layerAngle); wi.SetAngle(angle); wi.SetBboxChanged() } let rtWidth = Math.ceil(tempRect.width()); let rtHeight = Math.ceil(tempRect.height()); this._rcTex.set(0, 1, tempRect.width() / rtWidth, 1 - tempRect.height() / rtHeight); const maxTextureSize = renderer.GetMaxTextureSize(); const maxRtDim = Math.max(rtWidth, rtHeight); if (maxRtDim > maxTextureSize) { this._texScale = maxTextureSize / maxRtDim; rtWidth = Math.round(rtWidth * this._texScale); rtHeight = Math.round(rtHeight * this._texScale) } else this._texScale = 1; if (rtWidth <= 0 || rtHeight <= 0) { --drawDepth; return } this._drawScale = tempRect.width() / wi.GetWidth(); const drawScale = this._drawScale * this._texScale; const didRenderTargetChange = !this._renderTarget || this._renderTarget.GetWidth() !== rtWidth || this._renderTarget.GetHeight() !== rtHeight; if (didRenderTargetChange) this.Trigger(C3.Plugins.DrawingCanvas.Cnds.OnResolutionChanged); if (this._drawCommands.length > 0 || !this._renderTarget) { if (!this._renderTarget || didRenderTargetChange && this.HasAnyDrawingCommandInQueue()) this._UpdateRenderTargetSize(renderer, rtWidth, rtHeight); renderer.SetRenderTarget(this._renderTarget); this._SetRenderTargetDeviceTransform(renderer); this._ApplyCurrentDrawingBlendMode(renderer); for (const dc of this._drawCommands) dc.Do(renderer, drawScale, this); C3.clearArray(this._drawCommands); renderer.SetAlphaBlend(); if (this._multisampling > 0) { renderer.SetRenderTarget(this._texRenderTarget); renderer.CopyRenderTarget(this._renderTarget, "crop") } } --drawDepth } Draw(renderer) { const wi = this.GetWorldInfo(); const layer = wi.GetLayer(); const canvasManager = this._runtime.GetCanvasManager(); const lastRenderTarget = renderer.GetRenderTarget(); let quad = this._tempQuad; if (!this._renderTarget) return; renderer.SetTextureFillMode(); renderer.SetBlendMode(wi.GetBlendMode()); renderer.SetColor(wi.GetPremultipliedColor()); if (this._multisampling === 0) renderer.SetTexture(this._renderTarget.GetTexture()); else renderer.SetTexture(this._texRenderTarget.GetTexture()); let didChangeTransform = false; if (drawDepth > 0) { canvasManager.SetDeviceTransform(renderer, lastRenderTarget.GetWidth(), lastRenderTarget.GetHeight()); didChangeTransform = true } else if (wi.GetAngle() === 0 && wi.GetLayer().GetAngle() === 0) { canvasManager.SetDeviceTransform(renderer); didChangeTransform = true } else quad = wi.GetBoundingQuad(); renderer.Quad3(quad, this._rcTex); if (didChangeTransform) layer._SetTransform(renderer) } GetSnapshotPixel(x, y) { if (!this._snapshot) return [0, 0, 0, 0]; const width = this._snapshot.width; const height = this._snapshot.height; x = Math.floor(x); y = height - 1 - Math.floor(y); if (x < 0 || y < 0 || x >= width || y >= height) return [0, 0, 0, 0]; const data = this._snapshot.data; const ptr = y * width * 4 + x * 4; let r = data[ptr] / 255; let g = data[ptr + 1] / 255; let b = data[ptr + 2] / 255; let a = data[ptr + 3] / 255; if (a !== 0) { r /= a; g /= a; b /= a } return [r * 100, g * 100, b * 100, a * 100] } SetSnapshotPixel(x, y, rgb) { if (!this._snapshot) return [0, 0, 0, 0]; tempColor.setFromRgbValue(rgb); tempColor.premultiply(); const width = this._snapshot.width; const height = this._snapshot.height; x = Math.floor(x); y = height - 1 - Math.floor(y); if (x < 0 || y < 0 || x >= width || y >= height) return; const data = this._snapshot.data; const ptr = y * width * 4 + x * 4; data[ptr] = Math.floor(tempColor.getR() * 255); data[ptr + 1] = Math.floor(tempColor.getG() * 255); data[ptr + 2] = Math.floor(tempColor.getB() * 255); data[ptr + 3] = Math.floor(tempColor.getA() * 255) } GetImagePixelData() { return new Promise(resolve=>{ this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SaveImage(async imageData=>{ const imgDataBuffer = imageData.data.buffer; const width = imageData.width; const height = imageData.height; const processedBuffer = await this._runtime.AddJob("ProcessImageData", { "buffer": imgDataBuffer, "width": width, "height": height, "unpremultiply": true, "flipY": true }, [imgDataBuffer]); resolve(new ImageData(new Uint8ClampedArray(processedBuffer),width,height)) } )) } ) } LoadImagePixelData(imageData, premultiplyAlpha, flipY) { if (!this._renderTarget) throw new Error("canvas not yet ready"); if (imageData.width !== this._renderTarget.GetWidth() || imageData.height !== this._renderTarget.GetHeight()) throw new Error(`wrong size ImageData: expected ${this._renderTarget.GetWidth()} x ${this._renderTarget.GetHeight()}, got ${imageData.width} x ${imageData.height}`); C3.clearArray(this._drawCommands); const renderer = this._runtime.GetWebGLRenderer(); if (this._texRenderTarget) { const lastRenderTarget = renderer.GetRenderTarget(); const texture = this._texRenderTarget.GetTexture(); renderer.UpdateTexture(imageData, texture, { premultiplyAlpha: !!premultiplyAlpha, flipY: !!flipY }); renderer.SetRenderTarget(this._renderTarget); renderer.CopyRenderTarget(this._texRenderTarget, "crop"); renderer.SetRenderTarget(lastRenderTarget) } else { const texture = this._renderTarget.GetTexture(); renderer.UpdateTexture(imageData, texture, { premultiplyAlpha: !!premultiplyAlpha, flipY: !!flipY }) } this._runtime.UpdateRender() } GetScriptInterfaceClass() { return self.IDrawingCanvasInstance } } ; const map = new WeakMap; self.IDrawingCanvasInstance = class IDrawingCanvasInstance extends self.IWorldInstance { constructor() { super(); map.set(this, self.IInstance._GetInitInst().GetSdkInstance()) } getImagePixelData() { return map.get(this).GetImagePixelData() } loadImagePixelData(imageData, premultiplyAlpha=false) { map.get(this).LoadImagePixelData(imageData, premultiplyAlpha, true) } get surfaceDeviceWidth() { const rt = map.get(this)._GetRenderTarget(); if (!rt) throw new Error("canvas not yet ready"); return rt.GetWidth() } get surfaceDeviceHeight() { const rt = map.get(this)._GetRenderTarget(); if (!rt) throw new Error("canvas not yet ready"); return rt.GetHeight() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.DrawingCanvas.Cnds = { OnSavedImage() { return true }, OnSnapshot() { return true }, OnResolutionChanged() { return true } } } ;'use strict'; { const C3 = self.C3; function SortByInstanceZIndex(a, b) { return a.GetWorldInfo().GetZIndex() - b.GetWorldInfo().GetZIndex() } C3.Plugins.DrawingCanvas.Acts = { SetEffect(effect) { this.GetWorldInfo().SetBlendMode(effect); this._runtime.UpdateRender() }, ClearCanvas(rgb) { C3.clearArray(this._drawCommands); this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.ClearCanvas(rgb)) }, ClearRect(left, top, right, bottom, rgb) { if (left === right || top === bottom) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.ClearRect(left,top,right,bottom,rgb)) }, FillRect(left, top, right, bottom, rgb) { if (left === right || top === bottom) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillRect(left,top,right,bottom,rgb)) }, FillLinearGradient(left, top, right, bottom, rgb1, rgb2, dir) { if (left === right || top === bottom) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillLinearGradient(left,top,right,bottom,rgb1,rgb2,dir)) }, FillEllipse(x, y, radiusX, radiusY, rgb, edge) { if (radiusX <= 0 || radiusY <= 0) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillEllipse(x,y,radiusX,radiusY,rgb,edge !== 0)) }, OutlineEllipse(x, y, radiusX, radiusY, rgb, thickness, edge) { if (radiusX <= 0 || radiusY <= 0 || thickness <= 0) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.OutlineEllipse(x,y,radiusX,radiusY,rgb,thickness,edge !== 0)) }, OutlineRect(left, top, right, bottom, rgb, thickness) { if (left === right || top === bottom || thickness <= 0) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.OutlineRect(left,top,right,bottom,rgb,thickness)) }, Line(x1, y1, x2, y2, rgb, thickness, cap) { if (x1 === x2 && y1 === y2 || thickness <= 0) return; const capStr = cap === 0 ? "butt" : "square"; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.Line(x1,y1,x2,y2,rgb,thickness,capStr)) }, LineDashed(x1, y1, x2, y2, rgb, thickness, dashLength, cap) { if (x1 === x2 && y1 === y2 || thickness <= 0 || dashLength <= 0) return; const capStr = cap === 0 ? "butt" : "square"; const dashTex = this._GetLineDashTexture(); this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.LineDashed(x1,y1,x2,y2,rgb,thickness,dashLength,dashTex,capStr)) }, AddPolyPoint(x, y) { this._currentPoly.push([x, y]) }, ResetPoly() { C3.clearArray(this._currentPoly) }, LinePoly(rgb, thickness, cap) { if (this._currentPoly.length < 2 || thickness <= 0) return; const capStr = cap === 0 ? "butt" : "square"; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.LinePoly(this._ClonePoly(),rgb,thickness,capStr)) }, LineDashedPoly(rgb, thickness, dashLength, cap) { if (this._currentPoly.length < 2 || thickness <= 0 || dashLength <= 0) return; const capStr = cap === 0 ? "butt" : "square"; const dashTex = this._GetLineDashTexture(); this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.LineDashedPoly(this._ClonePoly(),rgb,thickness,dashLength,dashTex,capStr)) }, FillPoly(rgb) { if (this._currentPoly.length < 3) return; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.FillPoly(this._ClonePoly(),rgb)) }, SetDrawBlend(blendMode) { if (blendMode >= 2) blendMode++; this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SetDrawBlend(blendMode)) }, PasteObject(objectClass, includeFx) { if (!objectClass) return; const myWi = this.GetWorldInfo(); const myBbox = myWi.GetBoundingBox(); const myQuad = myWi.GetBoundingQuad(); const instances = objectClass.GetCurrentSol().GetInstances().filter(inst=>{ const instWi = inst.GetWorldInfo(); return instWi && myBbox.intersectsRect(instWi.GetBoundingBox()) && (myWi.GetAngle() === 0 || myQuad.intersectsQuad(instWi.GetBoundingQuad())) } ); if (instances.length === 0) return; instances.sort(SortByInstanceZIndex); this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.DrawInstances(instances,includeFx !== 0,myWi)) }, SaveImage(format, quality, x, y, width, height) { const formatStr = format === 0 ? "image/png" : "image/jpeg"; quality /= 100; const areaRect = C3.New(C3.Rect); areaRect.setWH(x, y, width, height); return new Promise(resolve=>{ this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SaveImage(async imageData=>{ const imgDataBuffer = imageData.data.buffer; const width = imageData.width; const height = imageData.height; const processedBuffer = await this._runtime.AddJob("ProcessImageData", { "buffer": imgDataBuffer, "width": width, "height": height, "unpremultiply": true, "flipY": !C3.Supports.ImageBitmapOptions }, [imgDataBuffer]); imageData = new ImageData(new Uint8ClampedArray(processedBuffer),width,height); let blob; if (C3.Supports.ImageBitmapOptions) { const imageBitmap = await createImageBitmap(imageData, { "premultiplyAlpha": "none", "imageOrientation": "flipY" }); blob = await C3.DrawableToBlob(imageBitmap, formatStr, quality) } else blob = await C3.ImageDataToBlob(imageData, formatStr, quality); if (this._savedImageUrl) URL.revokeObjectURL(this._savedImageUrl); this._savedImageUrl = URL.createObjectURL(blob); this.Trigger(C3.Plugins.DrawingCanvas.Cnds.OnSavedImage); resolve() } ,areaRect)) } ) }, SaveSnapshot() { return new Promise(resolve=>{ this._AddDrawCommand(new C3.Plugins.DrawingCanvas.DrawCommand.SaveImage(imageData=>{ this._snapshot = imageData; this.Trigger(C3.Plugins.DrawingCanvas.Cnds.OnSnapshot); resolve() } )) } ) }, ClearSnapshot() { this._snapshot = null }, SnapshotSetPixel(x, y, rgb) { this.SetSnapshotPixel(x, y, rgb) }, LoadSnapshot() { if (!this._snapshot || !this._renderTarget) return; if (this._snapshot.width !== this._renderTarget.GetWidth() || this._snapshot.height !== this._renderTarget.GetHeight()) return; this.LoadImagePixelData(this._snapshot, false) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.DrawingCanvas.Exps = { SavedImageURL() { return this._savedImageUrl }, SnapshotRedAt(x, y) { return this.GetSnapshotPixel(x, y)[0] }, SnapshotGreenAt(x, y) { return this.GetSnapshotPixel(x, y)[1] }, SnapshotBlueAt(x, y) { return this.GetSnapshotPixel(x, y)[2] }, SnapshotAlphaAt(x, y) { return this.GetSnapshotPixel(x, y)[3] }, SnapshotWidth() { return this._snapshot ? this._snapshot.width : 0 }, SnapshotHeight() { return this._snapshot ? this._snapshot.height : 0 }, PixelScale() { return 1 / (this._drawScale * this._texScale) }, SurfaceDeviceWidth() { const rt = this._GetRenderTarget(); return rt ? rt.GetWidth() : 0 }, SurfaceDeviceHeight() { const rt = this._GetRenderTarget(); return rt ? rt.GetHeight() : 0 } } } ;'use strict'; { const C3 = self.C3; const tempQuad = C3.New(C3.Quad); const tempUvQuad = C3.New(C3.Quad); const tempVector2 = C3.New(C3.Vector2); C3.Plugins.DrawingCanvas.DrawCommand = class DrawCommand { constructor() {} Do(renderer) { throw new Error("required override"); } } ; const DrawCommand = C3.Plugins.DrawingCanvas.DrawCommand; DrawCommand.SaveImage = class SaveImageCommand extends DrawCommand { constructor(callback, areaRect) { super(); this._callback = callback; this._areaRect = areaRect } Do(renderer, scale, canvasInst) { let readRenderTarget = renderer.GetRenderTarget(); if (readRenderTarget.GetMultisampling() > 0) { const texRenderTarget = canvasInst._GetTexRenderTarget(); renderer.SetRenderTarget(texRenderTarget); renderer.CopyRenderTarget(readRenderTarget, "crop"); renderer.SetRenderTarget(readRenderTarget); readRenderTarget = texRenderTarget } renderer.ReadBackRenderTargetToImageData(readRenderTarget, false, this._areaRect).then(this._callback) } } ; DrawCommand.ClearCanvas = class ClearCanvasCommand extends DrawCommand { constructor(rgb) { super(); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply() } Do(renderer) { renderer.Clear(this._color) } } ; DrawCommand.ClearRect = class ClearRectCommand extends DrawCommand { constructor(left, top, right, bottom, rgb) { super(); this._rect = C3.New(C3.Rect); this._rect.set(left, top, right, bottom); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply() } Do(renderer, scale, inst) { const rtHeight = inst._GetRenderTarget().GetHeight(); this._rect.multiply(scale, scale); this._rect.shuntY(rtHeight); renderer.ClearRect3(this._rect, this._color) } } ; DrawCommand.FillRect = class FillRectCommand extends DrawCommand { constructor(left, top, right, bottom, rgb) { super(); this._rect = C3.New(C3.Rect); this._rect.set(left, top, right, bottom); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply() } Do(renderer, scale) { renderer.SetColorFillMode(); renderer.SetColor(this._color); this._rect.multiply(scale, scale); renderer.Rect(this._rect) } } ; DrawCommand.FillLinearGradient = class FillLinearGradientCommand extends DrawCommand { constructor(left, top, right, bottom, rgb1, rgb2, dir) { super(); this._rect = C3.New(C3.Rect); this._rect.set(left, top, right, bottom); this._color1 = C3.New(C3.Color); this._color1.setFromRgbValue(rgb1); this._color2 = C3.New(C3.Color); this._color2.setFromRgbValue(rgb2); this._dir = dir } Do(renderer, scale) { renderer.SetLinearGradientFillMode(); renderer.SetColor(this._color1); renderer.SetGradientColor(this._color2); this._rect.multiply(scale, scale); tempQuad.setFromRect(this._rect); if (this._dir === 0) tempUvQuad.set(0, 0, 1, 0, 1, 1, 0, 1); else tempUvQuad.set(0, 1, 0, 0, 1, 0, 1, 1); renderer.Quad4(tempQuad, tempUvQuad) } } ; DrawCommand.FillEllipse = class FillEllipseCommand extends DrawCommand { constructor(x, y, radiusX, radiusY, rgb, isSmooth) { super(); this._rect = C3.New(C3.Rect); this._rect.set(x - radiusX, y - radiusY, x + radiusX, y + radiusY); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._isSmooth = isSmooth } Do(renderer, scale) { this._rect.multiply(scale, scale); if (this._isSmooth) { renderer.SetSmoothEllipseFillMode(); renderer.SetColor(this._color); this._rect.inflate(.5, .5); renderer.SetEllipseParams(1 / this._rect.width(), 1 / this._rect.height()); renderer.Rect(this._rect) } else { renderer.SetHardEllipseFillMode(); renderer.SetColor(this._color); renderer.Rect(this._rect) } } } ; DrawCommand.OutlineEllipse = class OutlinellipseCommand extends DrawCommand { constructor(x, y, radiusX, radiusY, rgb, thickness, isSmooth) { super(); this._rect = C3.New(C3.Rect); this._rect.set(x - radiusX, y - radiusY, x + radiusX, y + radiusY); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._thickness = thickness; this._isSmooth = isSmooth } Do(renderer, scale) { this._rect.multiply(scale, scale); if (this._isSmooth) { renderer.SetSmoothEllipseOutlineMode(); renderer.SetColor(this._color); this._rect.inflate(.5, .5); renderer.SetEllipseParams(1 / this._rect.width(), 1 / this._rect.height(), this._thickness * scale); renderer.Rect(this._rect) } else { renderer.SetHardEllipseOutlineMode(); renderer.SetEllipseParams(1 / this._rect.width(), 1 / this._rect.height(), this._thickness * scale); renderer.SetColor(this._color); renderer.Rect(this._rect) } } } ; DrawCommand.OutlineRect = class OutlineRectCommand extends DrawCommand { constructor(left, top, right, bottom, rgb, thickness) { super(); this._rect = C3.New(C3.Rect); this._rect.set(left, top, right, bottom); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._thickness = thickness } Do(renderer, scale) { renderer.SetColorFillMode(); renderer.SetColor(this._color); renderer.PushLineCapZag(); renderer.PushLineWidth(this._thickness * scale); this._rect.multiply(scale, scale); renderer.LineRect2(this._rect); renderer.PopLineCap(); renderer.PopLineWidth() } } ; DrawCommand.Line = class LineCommand extends DrawCommand { constructor(x1, y1, x2, y2, rgb, thickness, cap) { super(); this._rect = C3.New(C3.Rect); this._rect.set(x1, y1, x2, y2); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._thickness = thickness; this._cap = cap } Do(renderer, scale) { renderer.SetColorFillMode(); renderer.SetColor(this._color); renderer.PushLineCap(this._cap); renderer.PushLineWidth(this._thickness * scale); const rc = this._rect; rc.multiply(scale, scale); renderer.Line(rc.getLeft(), rc.getTop(), rc.getRight(), rc.getBottom()); renderer.PopLineCap(); renderer.PopLineWidth() } } ; DrawCommand.LinePoly = class LinePolyCommand extends DrawCommand { constructor(poly, rgb, thickness, cap) { super(); this._poly = poly; this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._thickness = thickness; this._cap = cap } Do(renderer, scale) { renderer.SetColorFillMode(); renderer.SetColor(this._color); renderer.PushLineCap(this._cap); renderer.PushLineWidth(this._thickness * scale); const poly = this._poly; for (let i = 0, len = poly.length; i < len; ++i) { const j = (i + 1) % len; const x1 = poly[i][0] * scale; const y1 = poly[i][1] * scale; const x2 = poly[j][0] * scale; const y2 = poly[j][1] * scale; renderer.Line(x1, y1, x2, y2) } renderer.PopLineCap(); renderer.PopLineWidth() } } ; DrawCommand.LineDashed = class LineDashedCommand extends DrawCommand { constructor(x1, y1, x2, y2, rgb, thickness, dashLength, dashTex, cap) { super(); this._rect = C3.New(C3.Rect); this._rect.set(x1, y1, x2, y2); this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._thickness = thickness; this._dashLength = dashLength; this._dashTex = dashTex; this._cap = cap } Do(renderer, scale) { renderer.SetTextureFillMode(); renderer.SetTexture(this._dashTex); renderer.SetColor(this._color); renderer.PushLineCap(this._cap); renderer.PushLineWidth(this._thickness * scale); const rc = this._rect; const numDashes = C3.distanceTo(rc.getLeft(), rc.getTop(), rc.getRight(), rc.getBottom()) / (this._dashLength * 2); rc.multiply(scale, scale); renderer.TexturedLine(rc.getLeft(), rc.getTop(), rc.getRight(), rc.getBottom(), 0, numDashes); renderer.PopLineCap(); renderer.PopLineWidth() } } ; DrawCommand.LineDashedPoly = class LineDashedPolyCommand extends DrawCommand { constructor(poly, rgb, thickness, dashLength, dashTex, cap) { super(); this._poly = poly; this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply(); this._thickness = thickness; this._dashLength = dashLength; this._dashTex = dashTex; this._cap = cap } Do(renderer, scale) { renderer.SetTextureFillMode(); renderer.SetTexture(this._dashTex); renderer.SetColor(this._color); renderer.PushLineCap(this._cap); renderer.PushLineWidth(this._thickness * scale); let u = 0; const poly = this._poly; for (let i = 0, len = poly.length; i < len; ++i) { const j = (i + 1) % len; const x1 = poly[i][0]; const y1 = poly[i][1]; const x2 = poly[j][0]; const y2 = poly[j][1]; const v = u + C3.distanceTo(x1, y1, x2, y2) / (this._dashLength * 2); renderer.TexturedLine(x1 * scale, y1 * scale, x2 * scale, y2 * scale, u, v); u = v - Math.floor(v) } renderer.PopLineCap(); renderer.PopLineWidth() } } ; DrawCommand.FillPoly = class FillPolyCommand extends DrawCommand { constructor(poly, rgb) { super(); this._poly = poly; this._color = C3.New(C3.Color); this._color.setFromRgbValue(rgb); this._color.premultiply() } Do(renderer, scale) { renderer.SetColorFillMode(); renderer.SetColor(this._color); const poly = this._poly; for (let i = 0, len = poly.length; i < len; ++i) { const p = poly[i]; p[0] *= scale; p[1] *= scale } const polyDecomp = self.polyDecomp; if (!polyDecomp.isSimple(poly)) return; polyDecomp.makeCCW(poly); polyDecomp.removeCollinearPoints(poly, C3.toRadians(.1)); const convexPolygons = polyDecomp.quickDecomp(poly); for (const convexPoly of convexPolygons) renderer.ConvexPoly(convexPoly.flat()) } } ; DrawCommand.SetDrawBlend = class SetDrawBlend extends DrawCommand { constructor(bm) { super(); this._blendIndex = bm } Do(renderer, scale, canvasInst) { canvasInst._SetDrawingBlendMode(this._blendIndex); canvasInst._ApplyCurrentDrawingBlendMode(renderer) } } ; DrawCommand.DrawInstances = class DrawInstancesCommand extends DrawCommand { constructor(instances, includeFx, canvasWi) { super(); this._includeFx = includeFx; this._instances = instances.map(inst=>this._SaveInstanceState(inst, canvasWi)) } _SaveInstanceState(inst, canvasWi) { const canvasAngle = canvasWi.GetAngle(); const canvasLayer = canvasWi.GetLayer(); const instWi = inst.GetWorldInfo(); const instLayer = instWi.GetLayer(); const oldX = instWi.GetX(); const oldY = instWi.GetY(); const oldWidth = instWi.GetWidth(); const oldHeight = instWi.GetHeight(); const oldAngle = instWi.GetAngle(); const areLayerTransformsCompatible = canvasLayer.IsTransformCompatibleWith(instLayer); if (!areLayerTransformsCompatible) { const [dsx,dsy] = instLayer.LayerToDrawSurface(oldX, oldY); const [tx,ty] = canvasLayer.DrawSurfaceToLayer(dsx, dsy); instWi.SetXY(tx, ty); const scaleFactor = instLayer.GetNormalScale() / canvasLayer.GetNormalScale(); instWi.SetSize(oldWidth * scaleFactor, oldHeight * scaleFactor); const angleOffset = canvasLayer.GetOwnAngle() - instLayer.GetOwnAngle(); instWi.OffsetAngle(angleOffset) } if (canvasAngle !== 0) { const canvasQuad = canvasWi.GetBoundingQuad(); const canvasMidX = canvasQuad.midX(); const canvasMidY = canvasQuad.midY(); const sinA = -canvasWi.GetSinAngle(); const cosA = canvasWi.GetCosAngle(); tempVector2.set(oldX, oldY); tempVector2.offset(-canvasMidX, -canvasMidY); tempVector2.rotatePrecalc(sinA, cosA); tempVector2.offset(canvasMidX, canvasMidY); instWi.SetXY(tempVector2.getX(), tempVector2.getY()); instWi.OffsetAngle(-canvasAngle) } if (canvasAngle !== 0 || !areLayerTransformsCompatible) instWi.SetBboxChanged(); const ret = [inst, inst.SaveToJson("visual-state")]; if (canvasAngle !== 0 || !areLayerTransformsCompatible) { instWi.SetXY(oldX, oldY); instWi.SetSize(oldWidth, oldHeight); instWi.SetAngle(oldAngle); instWi.SetBboxChanged() } return ret } Do(renderer, scale, canvasInst) { const canvasManager = canvasInst.GetRuntime().GetCanvasManager(); const layer = canvasInst.GetWorldInfo().GetLayer(); const viewport = layer.GetViewport(); const canvasBbox = canvasInst.GetWorldInfo().GetBoundingBox(); const renderTarget = canvasInst._GetRenderTarget(); const isMultisamplng = canvasInst.GetMultisampling() > 0; const includeFx = this._includeFx; const viewOffX = (viewport.width() - canvasBbox.width()) / -2; const viewOffY = (viewport.height() - canvasBbox.height()) / -2; const [canvasDeviceLeft,canvasDeviceTop] = layer.LayerToDrawSurface(canvasBbox.getLeft(), canvasBbox.getTop()); canvasManager.SetDeviceTransformOffset(canvasDeviceLeft, canvasDeviceTop); const canvasOffX = canvasBbox.getLeft() - viewport.getLeft(); const canvasOffY = canvasBbox.getTop() - viewport.getTop(); const offX = viewOffX + canvasOffX; const offY = viewOffY + canvasOffY; layer._SetTransform(renderer, offX, offY); for (let i = 0, len = this._instances.length; i < len; ++i) { const info = this._instances[i]; const inst = info[0]; const instState = info[1]; if (inst.IsDestroyed()) continue; const wi = inst.GetWorldInfo(); const bbox = wi.GetBoundingBox(); const oldState = inst.SaveToJson("visual-state"); inst.LoadFromJson(instState, "visual-state"); wi.GetBoundingBox(); if (includeFx && wi.HasAnyActiveEffect() && (!isMultisamplng || !wi.GetInstanceEffectList().HasAnyActiveBackgroundBlendingEffect())) { bbox.offset(-offX, -offY); const opts = { preTransform: ()=>layer._SetTransform(renderer, offX, offY) }; if (layer._DrawInstanceWithEffects(inst, wi, renderer, renderTarget, opts)) layer._SetTransform(renderer, offX, offY); wi.SetBboxChanged(); wi.GetBoundingBox() } else layer._DrawInstance(inst, wi, renderer); inst.LoadFromJson(oldState, "visual-state") } canvasManager.SetDeviceTransformOffset(0, 0); canvasInst._SetRenderTargetDeviceTransform(renderer); canvasInst._ApplyCurrentDrawingBlendMode(renderer) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Audio = class AudioPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Audio.Type = class AudioType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} GetScriptInterfaceClass() { return self.IAudioObjectType } } ; function GetAudioDOMInterface() { if (self["C3Audio_DOMInterface"]) return self["C3Audio_DOMInterface"]; else throw new Error("audio scripting API cannot be used here - make sure the project is using DOM mode, not worker mode"); } self.IAudioObjectType = class IAudioObjectType extends self.IObjectClass { constructor(objectType) { super(objectType) } get audioContext() { return GetAudioDOMInterface().GetAudioContext() } get destinationNode() { return GetAudioDOMInterface().GetDestinationNode() } } } ;'use strict'; { const C3 = self.C3; const DOM_COMPONENT_ID = "audio"; const LATENCY_HINTS = ["interactive", "balanced", "playback"]; C3.Plugins.Audio.Instance = class AudioInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst, DOM_COMPONENT_ID); this._nextPlayTime = 0; this._triggerTag = ""; this._timeScaleMode = 0; this._saveLoadMode = 0; this._playInBackground = false; this._panningModel = 1; this._distanceModel = 1; this._listenerX = this._runtime.GetViewportWidth() / 2; this._listenerY = this._runtime.GetViewportHeight() / 2; this._listenerZ = -600; this._referenceDistance = 600; this._maxDistance = 1E4; this._rolloffFactor = 1; this._listenerInst = null; this._loadListenerUid = -1; this._masterVolume = 1; this._isSilent = false; this._sampleRate = 0; this._effectCount = new Map; this._preloadTotal = 0; this._preloadCount = 0; this._remoteUrls = new Map; let latencyHint = "interactive"; if (properties) { this._timeScaleMode = properties[0]; this._saveLoadMode = properties[1]; this._playInBackground = properties[2]; latencyHint = LATENCY_HINTS[properties[3]]; this._panningModel = properties[4]; this._distanceModel = properties[5]; this._listenerZ = -properties[6]; this._referenceDistance = properties[7]; this._maxDistance = properties[8]; this._rolloffFactor = properties[9] } this._lastAIState = []; this._lastFxState = []; this._lastAnalysersData = []; this.AddDOMMessageHandlers([["state", e=>this._OnUpdateState(e)], ["fxstate", e=>this._OnUpdateFxState(e)], ["trigger", e=>this._OnTrigger(e)]]); const rt = this.GetRuntime().Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "instancedestroy", e=>this._OnInstanceDestroyed(e.instance)),C3.Disposable.From(rt, "afterload", ()=>this._OnAfterLoad()),C3.Disposable.From(rt, "suspend", ()=>this._OnSuspend()),C3.Disposable.From(rt, "resume", ()=>this._OnResume())); this._runtime.AddLoadPromise(this.PostToDOMAsync("create-audio-context", { "preloadList": this._runtime.GetAssetManager().GetAudioToPreload().map(o=>({ "originalUrl": o.originalUrl, "url": o.url, "type": o.type, "fileSize": o.fileSize })), "isiOSCordova": this._runtime.IsiOSCordova(), "timeScaleMode": this._timeScaleMode, "latencyHint": latencyHint, "panningModel": this._panningModel, "distanceModel": this._distanceModel, "refDistance": this._referenceDistance, "maxDistance": this._maxDistance, "rolloffFactor": this._rolloffFactor, "listenerPos": [this._listenerX, this._listenerY, this._listenerZ] }).then(info=>{ this._sampleRate = info["sampleRate"] } )); this._StartTicking() } Release() { this._listenerInst = null; super.Release() } _OnInstanceDestroyed(inst) { if (this._listenerInst === inst) this._listenerInst = null } DbToLinearNoCap(x) { return Math.pow(10, x / 20) } DbToLinear(x) { const v = this.DbToLinearNoCap(x); if (!isFinite(v)) return 0; return Math.max(Math.min(v, 1), 0) } LinearToDbNoCap(x) { return Math.log(x) / Math.log(10) * 20 } LinearToDb(x) { return this.LinearToDbNoCap(Math.max(Math.min(x, 1), 0)) } _OnSuspend() { if (this._playInBackground) return; this.PostToDOM("set-suspended", { "isSuspended": true }) } _OnResume() { if (this._playInBackground) return; this.PostToDOM("set-suspended", { "isSuspended": false }) } _OnUpdateState(e) { const tickCount = e["tickCount"]; const preservePlaceholders = this._lastAIState.filter(ai=>ai.hasOwnProperty("placeholder") && (ai["placeholder"] > tickCount || ai["placeholder"] === -1)); this._lastAIState = e["audioInstances"]; this._lastAnalysersData = e["analysers"]; if (preservePlaceholders.length > 0) C3.appendArray(this._lastAIState, preservePlaceholders) } _OnUpdateFxState(e) { this._lastFxState = e["fxstate"] } _GetFirstAudioStateByTag(tag) { for (const a of this._lastAIState) if (C3.equalsNoCase(a["tag"], tag)) return a; return null } _IsTagPlaying(tag) { return this._lastAIState.some(ai=>C3.equalsNoCase(tag, ai["tag"]) && ai["isPlaying"]) } _MaybeMarkAsPlaying(tag, isMusic, isLooping, vol) { if (this._IsTagPlaying(tag)) return null; const state = { "tag": tag, "duration": 0, "volume": vol, "isPlaying": true, "playbackTime": 0, "playbackRate": 1, "uid": -1, "bufferOriginalUrl": "", "bufferUrl": "", "bufferType": "", "isMusic": isMusic, "isLooping": isLooping, "isMuted": false, "resumePosition": 0, "pan": null, "placeholder": -1 }; this._lastAIState.push(state); return state } async _OnTrigger(e) { const type = e["type"]; this._triggerTag = e["tag"]; const aiId = e["aiid"]; if (type === "ended") { for (const aiState of this._lastAIState) if (aiState["aiid"] === aiId) { aiState["isPlaying"] = false; break } await this.TriggerAsync(C3.Plugins.Audio.Cnds.OnEnded) } else if (type === "fade-ended") await this.TriggerAsync(C3.Plugins.Audio.Cnds.OnFadeEnded) } Tick() { const o = { "timeScale": this._runtime.GetTimeScale(), "gameTime": this._runtime.GetGameTime(), "instPans": this.GetInstancePans(), "tickCount": this._runtime.GetTickCountNoSave() }; if (this._listenerInst) { const wi = this._listenerInst.GetWorldInfo(); this._listenerX = wi.GetX(); this._listenerY = wi.GetY(); o["listenerPos"] = [this._listenerX, this._listenerY, this._listenerZ] } this.PostToDOM("tick", o) } rotatePtAround(px, py, a, ox, oy) { if (a === 0) return [px, py]; const sin_a = Math.sin(a); const cos_a = Math.cos(a); px -= ox; py -= oy; const left_sin_a = px * sin_a; const top_sin_a = py * sin_a; const left_cos_a = px * cos_a; const top_cos_a = py * cos_a; px = left_cos_a - top_sin_a; py = top_cos_a + left_sin_a; px += ox; py += oy; return [px, py] } GetInstancePans() { return this._lastAIState.filter(ai=>ai["uid"] !== -1).map(ai=>this._runtime.GetInstanceByUID(ai["uid"])).filter(inst=>inst).map(inst=>{ const wi = inst.GetWorldInfo(); const layerAngle = wi.GetLayer().GetAngle(); const [x,y] = this.rotatePtAround(wi.GetX(), wi.GetY(), -layerAngle, this._listenerX, this._listenerY); return { "uid": inst.GetUID(), "x": x, "y": y, "angle": wi.GetAngle() - layerAngle } } ) } GetAnalyserData(tag, index) { for (const o of this._lastAnalysersData) if (o.index === index && C3.equalsNoCase(o.tag, tag)) return o; return null } _IncrementEffectCount(tag) { this._effectCount.set(tag, (this._effectCount.get(tag) || 0) + 1) } _ShouldSave(ai) { if (ai.hasOwnProperty("placeholder")) return false; if (this._saveLoadMode === 3) return false; else if (ai["isMusic"] && this._saveLoadMode === 1) return false; else if (!ai["isMusic"] && this._saveLoadMode === 2) return false; else return true } SaveToJson() { return { "isSilent": this._isSilent, "masterVolume": this._masterVolume, "listenerZ": this._listenerZ, "listenerUid": this._listenerInst ? this._listenerInst.GetUID() : -1, "remoteUrls": [...this._remoteUrls.entries()], "playing": this._lastAIState.filter(ai=>this._ShouldSave(ai)), "effects": this._lastFxState, "analysers": this._lastAnalysersData } } LoadFromJson(o) { this._isSilent = o["isSilent"]; this._masterVolume = o["masterVolume"]; this._listenerZ = o["listenerZ"]; this._listenerInst = null; this._loadListenerUid = o["listenerUid"]; this._remoteUrls.clear(); if (o["remoteUrls"]) for (const [k,v] of o["remoteUrls"]) this._remoteUrls.set(k, v); this._lastAIState = o["playing"]; this._lastFxState = o["effects"]; this._lastAnalysersData = o["analysers"] } _OnAfterLoad() { if (this._loadListenerUid !== -1) { this._listenerInst = this._runtime.GetInstanceByUID(this._loadListenerUid); this._loadListenerUid = -1; if (this._listenerInst) { const wi = this._listenerInst.GetWorldInfo(); this._listenerX = wi.GetX(); this._listenerY = wi.GetY() } } for (const ai of this._lastAIState) { const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(ai["bufferOriginalUrl"]); if (info) { ai["bufferUrl"] = info.url; ai["bufferType"] = info.type } else ai["bufferUrl"] = null } for (const fxChainData of Object.values(this._lastFxState)) for (const fxData of fxChainData) if (fxData.hasOwnProperty("bufferOriginalUrl")) { const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(fxData["bufferOriginalUrl"]); if (info) { fxData["bufferUrl"] = info.url; fxData["bufferType"] = info.type } } this.PostToDOM("load-state", { "saveLoadMode": this._saveLoadMode, "timeScale": this._runtime.GetTimeScale(), "gameTime": this._runtime.GetGameTime(), "listenerPos": [this._listenerX, this._listenerY, this._listenerZ], "isSilent": this._isSilent, "masterVolume": this._masterVolume, "playing": this._lastAIState.filter(ai=>ai["bufferUrl"] !== null), "effects": this._lastFxState }) } GetDebuggerProperties() { const fxProps = []; for (const [tag,fxChainData] of Object.entries(this._lastFxState)) fxProps.push({ name: "$" + tag, value: fxChainData.map(d=>d["type"]).join(", ") }); const prefix = "plugins.audio.debugger"; return [{ title: prefix + ".tag-effects", properties: fxProps }, { title: prefix + ".currently-playing", properties: [{ name: prefix + ".currently-playing-count", value: this._lastAIState.length }, ...this._lastAIState.map((s,index)=>({ name: "$#" + index, value: `${s["bufferOriginalUrl"]} ("${s["tag"]}") ${Math.round(s["playbackTime"] * 10) / 10} / ${Math.round(s["duration"] * 10) / 10}` }))] }] } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Audio.Cnds = { OnEnded(tag) { return C3.equalsNoCase(this._triggerTag, tag) }, OnFadeEnded(tag) { return C3.equalsNoCase(this._triggerTag, tag) }, PreloadsComplete() { return this._preloadCount === this._preloadTotal }, AdvancedAudioSupported() { return true }, IsSilent() { return this._isSilent }, IsAnyPlaying() { for (const ai of this._lastAIState) if (ai["isPlaying"]) return true; return false }, IsTagPlaying(tag) { return this._IsTagPlaying(tag) } } } ;'use strict'; { const C3 = self.C3; const FILTER_TYPES = ["lowpass", "highpass", "bandpass", "lowshelf", "highshelf", "peaking", "notch", "allpass"]; C3.Plugins.Audio.Acts = { async Play(file, looping, vol, tag) { if (this._isSilent) return; const isMusic = file[1]; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]); if (!info) return; const nextPlayTime = this._nextPlayTime; this._nextPlayTime = 0; const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol)); try { await this.PostToDOMAsync("play", { "originalUrl": file[0], "url": info.url, "type": info.type, "isMusic": isMusic, "tag": tag.toLowerCase(), "isLooping": looping !== 0, "vol": this.DbToLinear(vol), "pos": 0, "off": nextPlayTime, "trueClock": !!self["C3_GetAudioContextCurrentTime"] }) } finally { if (state) state["placeholder"] = this._runtime.GetTickCountNoSave() } }, async PlayAtPosition(file, looping, vol, x, y, angle, innerAngle, outerAngle, outerGain, tag) { if (this._isSilent) return; const isMusic = file[1]; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]); if (!info) return; const nextPlayTime = this._nextPlayTime; this._nextPlayTime = 0; const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol)); try { await this.PostToDOMAsync("play", { "originalUrl": file[0], "url": info.url, "type": info.type, "isMusic": isMusic, "tag": tag.toLowerCase(), "isLooping": looping !== 0, "vol": this.DbToLinear(vol), "pos": 0, "off": nextPlayTime, "trueClock": !!self["C3_GetAudioContextCurrentTime"], "panning": { "x": x, "y": y, "angle": C3.toRadians(angle), "innerAngle": C3.toRadians(innerAngle), "outerAngle": C3.toRadians(outerAngle), "outerGain": this.DbToLinear(outerGain) } }) } finally { if (state) state["placeholder"] = this._runtime.GetTickCountNoSave() } }, async PlayAtObject(file, looping, vol, objectClass, innerAngle, outerAngle, outerGain, tag) { if (this._isSilent) return; if (!objectClass) return; const inst = objectClass.GetFirstPicked(); if (!inst || !inst.GetWorldInfo()) return; const wi = inst.GetWorldInfo(); const layerAngle = wi.GetLayer().GetAngle(); const [x,y] = this.rotatePtAround(wi.GetX(), wi.GetY(), -layerAngle, this._listenerX, this._listenerY); const isMusic = file[1]; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]); if (!info) return; const nextPlayTime = this._nextPlayTime; this._nextPlayTime = 0; const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol)); try { await this.PostToDOMAsync("play", { "originalUrl": file[0], "url": info.url, "type": info.type, "isMusic": isMusic, "tag": tag.toLowerCase(), "isLooping": looping !== 0, "vol": this.DbToLinear(vol), "pos": 0, "off": nextPlayTime, "trueClock": !!self["C3_GetAudioContextCurrentTime"], "panning": { "x": x, "y": y, "angle": wi.GetAngle() - layerAngle, "innerAngle": C3.toRadians(innerAngle), "outerAngle": C3.toRadians(outerAngle), "outerGain": this.DbToLinear(outerGain), "uid": inst.GetUID() } }) } finally { if (state) state["placeholder"] = this._runtime.GetTickCountNoSave() } }, async PlayByName(folder, filename, looping, vol, tag) { if (this._isSilent) return; const isMusic = folder === 1; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase()); if (!info) return; const nextPlayTime = this._nextPlayTime; this._nextPlayTime = 0; const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol)); try { await this.PostToDOMAsync("play", { "originalUrl": filename, "url": info.url, "type": info.type, "isMusic": isMusic, "tag": tag.toLowerCase(), "isLooping": looping !== 0, "vol": this.DbToLinear(vol), "pos": 0, "off": nextPlayTime, "trueClock": !!self["C3_GetAudioContextCurrentTime"] }) } finally { if (state) state["placeholder"] = this._runtime.GetTickCountNoSave() } }, async PlayAtPositionByName(folder, filename, looping, vol, x, y, angle, innerAngle, outerAngle, outerGain, tag) { if (this._isSilent) return; const isMusic = folder === 1; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase()); if (!info) return; const nextPlayTime = this._nextPlayTime; this._nextPlayTime = 0; const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol)); try { await this.PostToDOMAsync("play", { "originalUrl": filename, "url": info.url, "type": info.type, "isMusic": isMusic, "tag": tag.toLowerCase(), "isLooping": looping !== 0, "vol": this.DbToLinear(vol), "pos": 0, "off": nextPlayTime, "trueClock": !!self["C3_GetAudioContextCurrentTime"], "panning": { "x": x, "y": y, "angle": C3.toRadians(angle), "innerAngle": C3.toRadians(innerAngle), "outerAngle": C3.toRadians(outerAngle), "outerGain": this.DbToLinear(outerGain) } }) } finally { if (state) state["placeholder"] = this._runtime.GetTickCountNoSave() } }, async PlayAtObjectByName(folder, filename, looping, vol, objectClass, innerAngle, outerAngle, outerGain, tag) { if (this._isSilent) return; if (this._isSilent) return; if (!objectClass) return; const inst = objectClass.GetFirstPicked(); if (!inst || !inst.GetWorldInfo()) return; const wi = inst.GetWorldInfo(); const layerAngle = wi.GetLayer().GetAngle(); const [x,y] = this.rotatePtAround(wi.GetX(), wi.GetY(), -layerAngle, this._listenerX, this._listenerY); const isMusic = folder === 1; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase()); if (!info) return; const nextPlayTime = this._nextPlayTime; this._nextPlayTime = 0; const state = this._MaybeMarkAsPlaying(tag.toLowerCase(), isMusic, looping !== 0, this.DbToLinear(vol)); try { await this.PostToDOMAsync("play", { "originalUrl": filename, "url": info.url, "type": info.type, "isMusic": isMusic, "tag": tag.toLowerCase(), "isLooping": looping !== 0, "vol": this.DbToLinear(vol), "pos": 0, "off": nextPlayTime, "trueClock": !!self["C3_GetAudioContextCurrentTime"], "panning": { "x": x, "y": y, "angle": wi.GetAngle() - layerAngle, "innerAngle": C3.toRadians(innerAngle), "outerAngle": C3.toRadians(outerAngle), "outerGain": this.DbToLinear(outerGain), "uid": inst.GetUID() } }) } finally { if (state) state["placeholder"] = this._runtime.GetTickCountNoSave() } }, SetLooping(tag, looping) { this.PostToDOM("set-looping", { "tag": tag.toLowerCase(), "isLooping": looping === 0 }) }, SetMuted(tag, muted) { this.PostToDOM("set-muted", { "tag": tag.toLowerCase(), "isMuted": muted === 0 }) }, SetVolume(tag, vol) { this.PostToDOM("set-volume", { "tag": tag.toLowerCase(), "vol": this.DbToLinear(vol) }) }, FadeVolume(tag, vol, duration, ending) { this.PostToDOM("fade-volume", { "tag": tag.toLowerCase(), "vol": this.DbToLinear(vol), "duration": duration, "stopOnEnd": ending === 0 }) }, async Preload(file) { const isMusic = file[1]; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]); if (!info) return; this._preloadTotal++; await this.PostToDOMAsync("preload", { "originalUrl": file[0], "url": info.url, "type": info.type, "isMusic": isMusic }); this._preloadCount++ }, async PreloadByName(folder, filename) { const isMusic = folder === 1; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase()); if (!info) return; this._preloadTotal++; await this.PostToDOMAsync("preload", { "originalUrl": filename, "url": info.url, "type": info.type, "isMusic": isMusic }); this._preloadCount++ }, SetPlaybackRate(tag, rate) { this.PostToDOM("set-playback-rate", { "tag": tag.toLowerCase(), "rate": Math.max(rate, 0) }) }, Stop(tag) { this.PostToDOM("stop", { "tag": tag.toLowerCase() }) }, StopAll() { this.PostToDOM("stop-all") }, SetPaused(tag, state) { this.PostToDOM("set-paused", { "tag": tag.toLowerCase(), "paused": state === 0 }) }, Seek(tag, pos) { this.PostToDOM("seek", { "tag": tag.toLowerCase(), "pos": pos }) }, SetSilent(s) { if (s === 2) s = this._isSilent ? 1 : 0; s = s === 0; if (this._isSilent === s) return; this._isSilent = s; this.PostToDOM("set-silent", { "isSilent": s }) }, SetMasterVolume(vol) { const mv = this.DbToLinear(vol); if (this._masterVolume === mv) return; this._masterVolume = mv; this.PostToDOM("set-master-volume", { "vol": mv }) }, AddFilterEffect(tag, type, freq, detune, q, gain, mix) { tag = tag.toLowerCase(); const typeStr = FILTER_TYPES[type]; this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "filter", "tag": tag, "params": [typeStr, freq, detune, q, gain, C3.clamp(mix / 100, 0, 1)] }) }, AddDelayEffect(tag, delay, gain, mix) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "delay", "tag": tag, "params": [delay, this.DbToLinear(gain), C3.clamp(mix / 100, 0, 1)] }) }, AddFlangerEffect(tag, delay, modulation, freq, feedback, mix) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "flanger", "tag": tag, "params": [delay / 1E3, modulation / 1E3, freq, feedback / 100, C3.clamp(mix / 100, 0, 1)] }) }, AddPhaserEffect(tag, freq, detune, q, mod, modfreq, mix) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "phaser", "tag": tag, "params": [freq, detune, q, mod, modfreq, C3.clamp(mix / 100, 0, 1)] }) }, AddConvolutionEffect(tag, file, norm, mix) { tag = tag.toLowerCase(); const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]); if (!info) return; this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "convolution", "tag": tag, "bufferOriginalUrl": file[0], "bufferUrl": info.url, "bufferType": info.type, "params": [norm === 0, C3.clamp(mix / 100, 0, 1)] }) }, AddGainEffect(tag, g) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "gain", "tag": tag, "params": [this.DbToLinear(g)] }) }, AddMuteEffect(tag) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "gain", "tag": tag, "params": [0] }) }, AddTremoloEffect(tag, freq, mix) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "tremolo", "tag": tag, "params": [freq, C3.clamp(mix / 100, 0, 1)] }) }, AddRingModEffect(tag, freq, mix) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "ringmod", "tag": tag, "params": [freq, C3.clamp(mix / 100, 0, 1)] }) }, AddDistortionEffect(tag, threshold, headroom, drive, makeupgain, mix) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "distortion", "tag": tag, "params": [this.DbToLinearNoCap(threshold), this.DbToLinearNoCap(headroom), drive, this.DbToLinearNoCap(makeupgain), C3.clamp(mix / 100, 0, 1)] }) }, AddCompressorEffect(tag, threshold, knee, ratio, attack, release) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "compressor", "tag": tag, "params": [threshold, knee, ratio, attack / 1E3, release / 1E3] }) }, AddAnalyserEffect(tag, fftSize, smoothing) { tag = tag.toLowerCase(); this._IncrementEffectCount(tag); this.PostToDOM("add-effect", { "type": "analyser", "tag": tag, "params": [fftSize, smoothing] }) }, RemoveEffects(tag) { tag = tag.toLowerCase(); this._effectCount.set(tag, 0); this.PostToDOM("remove-effects", { "tag": tag }); this._lastFxState = {} }, SetEffectParameter(tag, index, param, value, ramp, time) { this.PostToDOM("set-effect-param", { "tag": tag.toLowerCase(), "index": Math.floor(index), "param": param, "value": value, "ramp": ramp, "time": time }) }, SetListenerObject(objectClass) { if (!objectClass) return; const inst = objectClass.GetFirstPicked(); if (!inst || !inst.GetWorldInfo()) return; this._listenerInst = inst }, SetListenerZ(z) { this._listenerZ = z }, ScheduleNextPlay(t) { this._nextPlayTime = Math.max(t, 0) }, UnloadAudio(file) { const isMusic = file[1]; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(file[0]); if (!info) return; this.PostToDOM("unload", { "url": info.url, "type": info.type, "isMusic": isMusic }) }, UnloadAudioByName(folder, filename) { const isMusic = folder === 1; const info = this._runtime.GetAssetManager().GetProjectAudioFileUrl(filename) || this._remoteUrls.get(filename.toLowerCase()); if (!info) return; this.PostToDOM("unload", { "url": info.url, "type": info.type, "isMusic": isMusic }) }, UnloadAll() { this.PostToDOM("unload-all") }, AddRemoteURL(url, type, name) { this._remoteUrls.set(name.toLowerCase(), { url, type }) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.Audio.Exps = { Duration(tag) { const a = this._GetFirstAudioStateByTag(tag); return a ? a["duration"] : 0 }, PlaybackTime(tag) { const a = this._GetFirstAudioStateByTag(tag); return a ? a["playbackTime"] : 0 }, PlaybackRate(tag) { const a = this._GetFirstAudioStateByTag(tag); return a ? a["playbackRate"] : 0 }, Volume(tag) { const a = this._GetFirstAudioStateByTag(tag); return a ? this.LinearToDb(a["volume"]) : 0 }, MasterVolume() { return this.LinearToDb(this._masterVolume) }, EffectCount(tag) { return this._effectCount.get(tag.toLowerCase()) || 0 }, AnalyserFreqBinCount(tag, index) { const o = this.GetAnalyserData(tag, Math.floor(index)); return o ? o["binCount"] : 0 }, AnalyserFreqBinAt(tag, index, bin) { const o = this.GetAnalyserData(tag, Math.floor(index)); if (!o) return 0; bin = Math.floor(bin); if (bin < 0 || bin >= o["binCount"]) return 0; return o["freqBins"][bin] }, AnalyserPeakLevel(tag, index) { const o = this.GetAnalyserData(tag, Math.floor(index)); return o ? o["peak"] : 0 }, AnalyserRMSLevel(tag, index) { const o = this.GetAnalyserData(tag, Math.floor(index)); return o ? o["rms"] : 0 }, SampleRate() { return this._sampleRate }, CurrentTime() { if (self["C3_GetAudioContextCurrentTime"]) return self["C3_GetAudioContextCurrentTime"](); else return performance.now() / 1E3 } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.LocalStorage = class LocalStoragePlugin extends C3.SDKPluginBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.LocalStorage.Type = class LocalStorageType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; C3.Plugins.LocalStorage.Instance = class LocalStorageInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this._currentKey = ""; this._lastValue = ""; this._keyNamesList = []; this._errorMessage = ""; this._pendingGets = 0; this._pendingSets = 0; this._storage = this._runtime._GetProjectStorage(); this._debugCache = new Map; this._isLoadingDebugCache = false } Release() { super.Release() } async _TriggerStorageError(err) { this._errorMessage = this._GetErrorString(err); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnError) } _GetErrorString(err) { if (!err) return "unknown error"; else if (typeof err === "string") return err; else if (typeof err.message === "string") return err.message; else if (typeof err.name === "string") return err.name; else if (typeof err.data === "string") return err.data; else return "unknown error" } GetDebuggerProperties() { if (!this._isLoadingDebugCache) this._DebugCacheStorage(); return [{ title: "plugins.localstorage.name", properties: [...this._debugCache.entries()].map(entry=>({ name: "$" + entry[0], value: entry[1], onedit: v=>this._storage.setItem(entry[0], v) })) }] } async _DebugCacheStorage() { this._isLoadingDebugCache = true; try { const keyList = await this._storage.keys(); keyList.sort((a,b)=>{ const la = a.toLowerCase(); const lb = b.toLowerCase(); if (la < lb) return -1; else if (lb < la) return 1; else return 0 } ); const values = await Promise.all(keyList.map(key=>this._storage.getItem(key))); this._debugCache.clear(); for (let i = 0, len = keyList.length; i < len; ++i) this._debugCache.set(keyList[i], values[i]) } catch (err) { console.warn("[C3 debugger] Error displaying local storage: ", err) } finally { this._isLoadingDebugCache = false } } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.LocalStorage.Cnds = { OnItemSet(key) { return this._currentKey === key }, OnAnyItemSet() { return true }, OnItemGet(key) { return this._currentKey === key }, OnAnyItemGet() { return true }, OnItemRemoved(key) { return this._currentKey === key }, OnAnyItemRemoved() { return true }, OnCleared() { return true }, OnAllKeyNamesLoaded() { return true }, OnError() { return true }, OnItemExists(key) { return this._currentKey === key }, OnItemMissing(key) { return this._currentKey === key }, CompareKey(cmp, key) { return C3.compare(this._currentKey, cmp, key) }, CompareValue(cmp, v) { return C3.compare(this._lastValue, cmp, v) }, IsProcessingSets() { return this._pendingSets > 0 }, IsProcessingGets() { return this._pendingGets > 0 }, OnAllSetsComplete() { return true }, OnAllGetsComplete() { return true } } } ;'use strict'; { const C3 = self.C3; function IsExpressionType(x) { return typeof x === "string" || typeof x === "number" } C3.Plugins.LocalStorage.Acts = { async SetItem(key, value) { this._pendingSets++; try { const valueSet = await this._storage.setItem(key, value); await this.ScheduleTriggers(async()=>{ this._currentKey = key; this._lastValue = valueSet; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemSet); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemSet) } ) } catch (err) { await this._TriggerStorageError(err) } finally { this._pendingSets--; if (this._pendingSets === 0) await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllSetsComplete) } }, async SetBinaryItem(key, objectClass) { if (!objectClass) return; const inst = objectClass.GetFirstPicked(this._inst); if (!inst) return; const sdkInst = inst.GetSdkInstance(); if (!sdkInst) return; const buffer = sdkInst.GetArrayBufferReadOnly(); this._pendingSets++; try { await this._storage.setItem(key, buffer); await this.ScheduleTriggers(async()=>{ this._currentKey = key; this._lastValue = ""; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemSet); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemSet) } ) } catch (err) { await this._TriggerStorageError(err) } finally { this._pendingSets--; if (this._pendingSets === 0) await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllSetsComplete) } }, async GetItem(key) { this._pendingGets++; try { const value = await this._storage.getItem(key); await this.ScheduleTriggers(async()=>{ this._currentKey = key; this._lastValue = IsExpressionType(value) ? value : ""; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemGet); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemGet) } ) } catch (err) { await this._TriggerStorageError(err) } finally { this._pendingGets--; if (this._pendingGets === 0) await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllGetsComplete) } }, async GetBinaryItem(key, objectClass) { if (!objectClass) return; const inst = objectClass.GetFirstPicked(this._inst); if (!inst) return; const sdkInst = inst.GetSdkInstance(); this._pendingGets++; try { let value = await this._storage.getItem(key); value = value instanceof ArrayBuffer ? value : new ArrayBuffer(0); await this.ScheduleTriggers(async()=>{ this._lastValue = ""; this._currentKey = key; sdkInst.SetArrayBufferTransfer(value); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemGet); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemGet) } ) } catch (err) { await this._TriggerStorageError(err) } finally { this._pendingGets--; if (this._pendingGets === 0) await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllGetsComplete) } }, async CheckItemExists(key) { try { const value = await this._storage.getItem(key); await this.ScheduleTriggers(async()=>{ this._currentKey = key; if (typeof value === "undefined" || value === null) { this._lastValue = ""; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemMissing) } else { this._lastValue = IsExpressionType(value) ? value : ""; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemExists) } } ) } catch (err) { await this._TriggerStorageError(err) } }, async RemoveItem(key) { try { await this._storage.removeItem(key); await this.ScheduleTriggers(async()=>{ this._currentKey = key; this._lastValue = ""; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAnyItemRemoved); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnItemRemoved) } ) } catch (err) { await this._TriggerStorageError(err) } }, async ClearStorage() { try { await this._storage.clear(); await this.ScheduleTriggers(async()=>{ this._currentKey = ""; this._lastValue = ""; C3.clearArray(this._keyNamesList); await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnCleared) } ) } catch (err) { await this._TriggerStorageError(err) } }, async GetAllKeyNames() { try { const keyList = await this._storage.keys(); await this.ScheduleTriggers(async()=>{ this._keyNamesList = keyList; await this.TriggerAsync(C3.Plugins.LocalStorage.Cnds.OnAllKeyNamesLoaded) } ) } catch (err) { await this._TriggerStorageError(err) } } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.LocalStorage.Exps = { ItemValue() { return this._lastValue }, Key() { return this._currentKey }, KeyCount() { return this._keyNamesList.length }, KeyAt(i) { i = Math.floor(i); if (i < 0 || i >= this._keyNamesList.length) return ""; return this._keyNamesList[i] }, ErrorMessage() { return this._errorMessage } } } ;"use strict"; function rstr_md5(s) { return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); } function rstr_hmac_md5(key, data) { var bkey = rstr2binl(key); if (bkey.length > 16) bkey = binl_md5(bkey, key.length * 8); var ipad = Array(16) , opad = Array(16); for (var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); } function rstr2any(input, encoding) { var divisor = encoding.length; var i, j, q, x, quotient; var dividend = Array(Math.ceil(input.length / 2)); for (i = 0; i < dividend.length; i++) { dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); } var full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2))); var remainders = Array(full_length); for (j = 0; j < full_length; j++) { quotient = Array(); x = 0; for (i = 0; i < dividend.length; i++) { x = (x << 16) + dividend[i]; q = Math.floor(x / divisor); x -= q * divisor; if (quotient.length > 0 || q > 0) quotient[quotient.length] = q; } remainders[j] = x; dividend = quotient; } var output = ""; for (i = remainders.length - 1; i >= 0; i--) output += encoding.charAt(remainders[i]); return output; } function str2rstr_utf8(input) { var output = ""; var i = -1; var x, y; while (++i < input.length) { x = input.charCodeAt(i); y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) { x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); i++; } if (x <= 0x7F) output += String.fromCharCode(x); else if (x <= 0x7FF) output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F), 0x80 | (x & 0x3F)); else if (x <= 0xFFFF) output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F)); else if (x <= 0x1FFFFF) output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), 0x80 | ((x >>> 12) & 0x3F), 0x80 | ((x >>> 6) & 0x3F), 0x80 | (x & 0x3F)); } return output; } function str2rstr_utf16le(input) { var output = ""; for (var i = 0; i < input.length; i++) output += String.fromCharCode(input.charCodeAt(i) & 0xFF, (input.charCodeAt(i) >>> 8) & 0xFF); return output; } function str2rstr_utf16be(input) { var output = ""; for (var i = 0; i < input.length; i++) output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, input.charCodeAt(i) & 0xFF); return output; } function rstr2binl(input) { var output = Array(input.length >> 2); for (var i = 0; i < output.length; i++) output[i] = 0; for (var i = 0; i < input.length * 8; i += 8) output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32); return output; } function binl2rstr(input) { var output = ""; for (var i = 0; i < input.length * 32; i += 8) output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF); return output; } function binl_md5(x, len) { x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for (var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return Array(a, b, c, d); } function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } function rstr_sha1(s) { return binb2rstr(binb_sha1(rstr2binb(s), s.length * 8)); } function rstr_hmac_sha1(key, data) { var bkey = rstr2binb(key); if (bkey.length > 16) bkey = binb_sha1(bkey, key.length * 8); var ipad = Array(16) , opad = Array(16); for (var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = binb_sha1(ipad.concat(rstr2binb(data)), 512 + data.length * 8); return binb2rstr(binb_sha1(opad.concat(hash), 512 + 160)); } function rstr2binb(input) { var output = Array(input.length >> 2); for (var i = 0; i < output.length; i++) output[i] = 0; for (var i = 0; i < input.length * 8; i += 8) output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32); return output; } function binb2rstr(input) { var output = ""; for (var i = 0; i < input.length * 32; i += 8) output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF); return output; } function binb_sha1(x, len) { x[len >> 5] |= 0x80 << (24 - len % 32); x[((len + 64 >> 9) << 4) + 15] = len; var w = Array(80); var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var e = -1009589776; for (var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; var olde = e; for (var j = 0; j < 80; j++) { if (j < 16) w[j] = x[i + j]; else w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); var t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j))); e = d; d = c; c = bit_rol(b, 30); b = a; a = t; } a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); e = safe_add(e, olde); } return Array(a, b, c, d, e); } function sha1_ft(t, b, c, d) { if (t < 20) return (b & c) | ((~b) & d); if (t < 40) return b ^ c ^ d; if (t < 60) return (b & c) | (b & d) | (c & d); return b ^ c ^ d; } function sha1_kt(t) { return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; } function rstr_sha256(s) { return binb2rstr(binb_sha256(rstr2binb(s), s.length * 8)); } function rstr_hmac_sha256(key, data) { var bkey = rstr2binb(key); if (bkey.length > 16) bkey = binb_sha256(bkey, key.length * 8); var ipad = Array(16) , opad = Array(16); for (var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8); return binb2rstr(binb_sha256(opad.concat(hash), 512 + 256)); } function sha256_S(X, n) { return (X >>> n) | (X << (32 - n)); } function sha256_R(X, n) { return (X >>> n); } function sha256_Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); } function sha256_Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); } function sha256_Sigma0256(x) { return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22)); } function sha256_Sigma1256(x) { return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25)); } function sha256_Gamma0256(x) { return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3)); } function sha256_Gamma1256(x) { return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10)); } function sha256_Sigma0512(x) { return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39)); } function sha256_Sigma1512(x) { return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41)); } function sha256_Gamma0512(x) { return (sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7)); } function sha256_Gamma1512(x) { return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6)); } var sha256_K = new Array(1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998); function binb_sha256(m, l) { var HASH = new Array(1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225); var W = new Array(64); var a, b, c, d, e, f, g, h; var i, j, T1, T2; m[l >> 5] |= 0x80 << (24 - l % 32); m[((l + 64 >> 9) << 4) + 15] = l; for (i = 0; i < m.length; i += 16) { a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7]; for (j = 0; j < 64; j++) { if (j < 16) W[j] = m[j + i]; else W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), sha256_Gamma0256(W[j - 15])), W[j - 16]); T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), sha256_K[j]), W[j]); T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c)); h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2); } HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]); } return HASH; } { C3.Plugins.CBhash = class CBhashPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Plugins.CBhash.Type = class CBhashType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Plugins.CBhash.Instance = class CBhashInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this._testProperty = 0; this.lastResult = ""; this.hexcase = 0; this.b64pad = " "; if (properties) {} } Release() { super.Release(); } SaveToJson() { return {}; } LoadFromJson(o) {} hex_md5(s) { return this.rstr2hex(rstr_md5(str2rstr_utf8(s))); } b64_md5(s) { return this.rstr2b64(rstr_md5(str2rstr_utf8(s))); } any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); } hex_hmac_md5(k, d) { return this.rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } b64_hmac_md5(k, d) { return this.rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } any_hmac_md5(k, d, e) { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); } hex_sha1(s) { return this.rstr2hex(rstr_sha1(str2rstr_utf8(s))); } b64_sha1(s) { return this.rstr2b64(rstr_sha1(str2rstr_utf8(s))); } any_sha1(s, e) { return rstr2any(rstr_sha1(str2rstr_utf8(s)), e); } hex_hmac_sha1(k, d) { return this.rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))); } b64_hmac_sha1(k, d) { return this.rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d))); } any_hmac_sha1(k, d, e) { return rstr2any(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)), e); } hex_sha256(s) { return this.rstr2hex(rstr_sha256(str2rstr_utf8(s))); } b64_sha256(s) { return this.rstr2b64(rstr_sha256(str2rstr_utf8(s))); } any_sha256(s, e) { return rstr2any(rstr_sha256(str2rstr_utf8(s)), e); } hex_hmac_sha256(k, d) { return this.rstr2hex(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); } b64_hmac_sha256(k, d) { return this.rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); } any_hmac_sha256(k, d, e) { return rstr2any(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)), e); } rstr2hex(input) { try { this.hexcase } catch (e) { this.hexcase = 0; } var hex_tab = this.hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var output = ""; var x; for (var i = 0; i < input.length; i++) { x = input.charCodeAt(i); output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F); } return output; } rstr2b64(input) { try { this.b64pad } catch (e) { this.b64pad = ''; } var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var output = ""; var len = input.length; for (var i = 0; i < len; i += 3) { var triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0); for (var j = 0; j < 4; j++) { if (i * 8 + j * 6 > input.length * 8) output += this.b64pad; else output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); } } return output; } } ; } "use strict"; { C3.Plugins.CBhash.Cnds = { OnHashed() { return true; } }; } "use strict"; { C3.Plugins.CBhash.Acts = { set_hexoutput(format) { if (format == 0) this.hexcase = 0; else this.hexcase = 1; }, set_bpad(charac) { this.b64pad = charac; }, MD5_hash(string, format) { var outF = format; if (outF == 0) this.lastResult = this.hex_md5(string); else this.lastResult = this.b64_md5(string); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, MD5_pass(string, encoding) { this.lastResult = this.any_md5(string, encoding); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMAC_hash(key, data, Format) { if (Format == 0) this.lastResult = this.hex_hmac_md5(key, data); else this.lastResult = this.b64_hmac_md5(key, data); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMAC_pass(key, data, charString) { this.lastResult = this.any_hmac_md5(key, data, charString); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA1_hash(string, format) { var outF = format; if (outF == 0) this.lastResult = this.hex_sha1(string); else this.lastResult = this.b64_sha1(string); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA1_pass(string, encoding) { this.lastResult = this.any_sha1(string, encoding); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA1_hash(key, data, Format) { if (Format == 0) this.lastResult = this.hex_hmac_sha1(key, data); else this.lastResult = this.b64_hmac_sha1(key, data); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA1_pass(key, data, charString) { this.lastResult = this.any_hmac_sha1(key, data, charString); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA256_hash(string, format) { var outF = format; if (outF == 0) this.lastResult = this.hex_sha256(string); else this.lastResult = this.b64_sha256(string); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA256_pass(string, encoding) { this.lastResult = this.any_sha256(string, encoding); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA256_hash(key, data, Format) { if (Format == 0) this.lastResult = this.hex_hmac_sha256(key, data); else this.lastResult = this.b64_hmac_sha256(key, data); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA256_pass(key, data, charString) { this.lastResult = this.any_hmac_sha256(key, data, charString); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); } }; } "use strict"; { C3.Plugins.CBhash.Exps = { get_lastResult() { return (this.lastResult); }, MD5(data) { return (this.hex_md5(data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, MD5B(data) { return (this.b64_md5(data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, MD5pass(data, charstring) { return (this.any_md5(data, charstring)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACMD5(key, data) { return (this.hex_hmac_md5(key, data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACMD5B(key, data) { return (this.b64_hmac_md5(key, data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACMD5pass(key, data, charstring) { return (this.any_hmac_md5(key, data, charstring)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA1(data) { return (this.hex_sha1(data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA1B(data) { return (this.b64_sha1(data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA1pass(data, charstring) { return (this.any_sha1(data, charstring)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA1(key, data) { return (this.hex_hmac_sha1(key, data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA1B(key, data) { return (this.b64_hmac_sha1(key, data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA1pass(key, data, charstring) { return (this.any_hmac_sha1(key, data, charstring)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA256(data) { return (this.hex_sha256(data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA256B(data) { return (this.b64_sha256(data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, SHA256pass(data, charstring) { return (this.any_sha256(data, charstring)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA256(key, data) { return (this.hex_hmac_sha256(key, data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA256B(key, data) { return (this.b64_hmac_sha256(key, data)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); }, HMACSHA256pass(key, data, charstring) { return (this.any_hmac_sha256(key, data, charstring)); this.Trigger(C3.Plugins.CBhash.Cnds.OnHashed); } }; } "use strict"; { C3.Plugins.Sparsha_copyclip = class copyclipPlugin extends C3.SDKPluginBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Plugins.Sparsha_copyclip.Type = class copyclipType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; var textToCopy = ""; if (typeof document != "undefined") var Input = document.createElement("input"); var onCopy = 0; var errorClipboard = ""; var onErrorCopy = 0; var onGet = 0; var onErrorGet = 0; var GetText = ""; { C3.Plugins.Sparsha_copyclip.Instance = class copyclipInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); if (properties) {} } Release() { super.Release(); } SaveToJson() { return {}; } LoadFromJson(o) {} GetDebuggerProperties() { return [{ title: "copyclip", properties: [] }]; } } ; } "use strict"; { C3.Plugins.Sparsha_copyclip.Cnds = { OnCopy() { if (onCopy == 1) { onCopy = 0; return true; } else return false; }, OnGet() { if (onGet == 1) { onGet = 0; return true; } else return false; }, OnCopyError() { if (onErrorCopy == 1) { onErrorCopy = 0; return true; } else return false; }, OnGetError() { if (onErrorGet == 1) { onErrorGet = 0; return true; } else return false; } }; } "use strict"; { C3.Plugins.Sparsha_copyclip.Acts = { Copy(Text, buttonId) { textToCopy = Text; Input.id = "Texty"; Input.value = textToCopy; document.getElementById(buttonId).onclick = function() { doCopy(); } ; function doCopy() { Input = document.createElement("input"); Input.id = "Texty"; Input.value = textToCopy; document.getElementsByTagName('body')[0].appendChild(Input); var copyText = document.getElementById("Texty"); copyText.select(); copyText.setSelectionRange(0, 99999); document.execCommand("copy"); Input.remove(); } }, async ApiCopy(Text) { window.focus(); await navigator.clipboard.writeText(Text).then(()=>{ onCopy = 1; } ).catch(err=>{ errorClipboard = err.message; onErrorCopy = 1; console.log("--Error Report----------------") console.error("error: ", errorClipboard); console.log("------------------------------") } ); }, async ApiGet() { window.focus(); await navigator.clipboard.readText().then(Text=>{ GetText = Text; onGet = 1; } ).catch(err=>{ errorClipboard = err.message; onErrorGet = 1; console.log("--Error Report----------------") console.error("error: ", errorClipboard); console.log("------------------------------") } ); }, ClearError() { errorClipboard = ""; onErrorCopy = 0; onErrorGet = 0; } }; } "use strict"; { C3.Plugins.Sparsha_copyclip.Exps = { clipboardData() { return GetText; }, error() { return errorClipboard; } }; } "use strict"; { C3.Plugins.Massive_Cube_Forge = class ForgePlugin extends C3.SDKPluginBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Plugins.Massive_Cube_Forge.Type = class ForgeType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Plugins.Massive_Cube_Forge.Instance = class ForgeInstance extends C3.SDKInstanceBase { constructor(inst, properties) { super(inst); this.ky = undefined; this.iv = undefined; this.kyIsLongEnough = false; this.IVIsLongEnough = false; this.result = ""; if (properties) {} this.cipher = undefined; this.decipher = undefined; this.forg = new globalThis["forge"]; this.encb64 = function(str) { return this.forg.util.encode64(str); } this.decb64 = function(str) { return this.forg.util.decode64(str); } this.psrand = function(lng) { var bytes = this.forg.random.getBytesSync(lng); return this.forg.util.bytesToHex(bytes); } this.sha1 = function(data, _this) { var md = _this.forg.md.sha1.create(); md.update(data); return md.digest().toHex(); } this.sha256 = function(data, _this) { var md = _this.forg.md.sha256.create(); md.update(data); return md.digest().toHex(); } this.sha384 = function(data, _this) { var md = _this.forg.md.sha384.create(); md.update(data); return md.digest().toHex(); } this.sha512 = function(data, _this) { var md = _this.forg.md.sha512.create(); md.update(data); return md.digest().toHex(); } this.md5 = function(data, _this) { var md = _this.forg.md.md5.create(); md.update(data); return md.digest().toHex(); } this.clKAiV = function(_this) { _this.ky = ""; _this.iv = ""; } this.getTypeIDStr = function(id) { switch (id) { case 0: return "AES-ECB"; break; case 1: return "AES-CBC"; break; case 2: return "AES-CFB"; break; case 3: return "AES-OFB"; break; case 4: return "AES-GCM"; break; case 5: return "3DES-ECB"; break; case 6: return "3DES-CBC"; break; case 7: return "DES-ECB"; break; case 8: return "DES-CBC"; break; default: return "AES-ECB"; } } this.encr = function(type, _this, text) { var plaintext = text.toString(); var ky = _this.ky; var objiv = {}; objiv["iv"] = _this.iv; var cipher = _this.forg.cipher.createCipher(_this.getTypeIDStr(type), ky); cipher.start(objiv); cipher.update(_this.forg.util.createBuffer(plaintext)); cipher.finish(); var encrypted = cipher.output; _this.result = _this.forg.util.encode64(encrypted.data); } this.decr = function(type, _this, text) { var plaintext = text.toString(); var ky = _this.ky; var objiv = {}; objiv["iv"] = _this.iv; var decodedB64 = _this.forg.util.decode64(plaintext); var input = _this.forg.util.createBuffer(decodedB64, 'binary'); input.getBytes(decodedB64); var decipher = _this.forg.cipher.createDecipher(_this.getTypeIDStr(type), ky); decipher.start(objiv); decipher.update(input); var result = decipher.finish(); _this.result = decipher.output.data; } this.setky = function(ky, _this) { if ((ky.length == 16) || (ky.length == 24) || (ky.length == 32)) { _this.ky = ky; _this.kyIsLongEnough = true; } else { _this.kyIsLongEnough = false; console.warn("ky is not 16, 24 or 32 chars long!"); } } this.setIV = function(iv, _this) { if (iv.length > 0) { _this.iv = iv; _this.IVIsLongEnough = true; } else { _this.IVIsLongEnough = false; _this.iv = ""; console.warn("iv is not long enough!"); } } } Release() { super.Release(); } SaveToJson() { return {}; } LoadFromJson(o) {} } ; } "use strict"; { C3.Plugins.Massive_Cube_Forge.Cnds = {}; } "use strict"; { C3.Plugins.Massive_Cube_Forge.Acts = { setKey(key) { this.setky(key, this); }, setIV(iv) { this.setIV(iv, this); }, encrypt(type, text) { this.encr(type, this, text); }, decrypt(type, text) { this.decr(type, this, text); }, clKyAIV() { this.clKAiV(this); } }; } "use strict"; { C3.Plugins.Massive_Cube_Forge.Exps = { getresult() { return this.result; }, getSHA1(data) { return this.sha1(data, this); }, getSHA256(data) { return this.sha256(data, this); }, getSHA384(data) { return this.sha384(data, this); }, getSHA512(data) { return this.sha512(data, this); }, MD5(data) { return this.md5(data, this); }, getrandomvalues(lng) { return this.psrand(lng); }, encodeb64(str) { return this.encb64(str); }, decodeb64(str) { return this.decb64(str); } }; } 'use strict'; { const C3 = self.C3; const DOM_COMPONENT_ID = "text-input"; C3.Plugins.TextBox = class TextInputPlugin extends C3.SDKDOMPluginBase { constructor(opts) { super(opts, DOM_COMPONENT_ID); this.AddElementMessageHandler("click", (sdkInst,e)=>sdkInst._OnClick(e)); this.AddElementMessageHandler("dblclick", (sdkInst,e)=>sdkInst._OnDoubleClick(e)); this.AddElementMessageHandler("change", (sdkInst,e)=>sdkInst._OnChange(e)) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TextBox.Type = class TextInputType extends C3.SDKTypeBase { constructor(objectClass) { super(objectClass) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const TEXT = 0; const PLACEHOLDER = 1; const TOOLTIP = 2; const INITIALLY_VISIBLE = 3; const ENABLE = 4; const READ_ONLY = 5; const SPELL_CHECK = 6; const TYPE = 7; const AUTO_FONT_SIZE = 8; const ID = 9; const DOM_COMPONENT_ID = "text-input"; const elemTypes = ["text", "password", "email", "number", "tel", "url", "textarea", "search"]; C3.Plugins.TextBox.Instance = class TextInputInstance extends C3.SDKDOMInstanceBase { constructor(inst, properties) { super(inst, DOM_COMPONENT_ID); this._text = ""; this._placeholder = ""; this._title = ""; this._isEnabled = true; this._isReadOnly = false; this._spellCheck = false; this._type = "text"; this._autoFontSize = true; this._maxLength = -1; this._id = ""; if (properties) { this._text = properties[TEXT]; this._placeholder = properties[PLACEHOLDER]; this._title = properties[TOOLTIP]; this.GetWorldInfo().SetVisible(properties[INITIALLY_VISIBLE]); this._isEnabled = properties[ENABLE]; this._isReadOnly = properties[READ_ONLY]; this._spellCheck = properties[SPELL_CHECK]; this._type = elemTypes[properties[TYPE]]; this._autoFontSize = properties[AUTO_FONT_SIZE]; this._id = properties[ID] } this.CreateElement({ "type": this._type, "id": this._id }) } Release() { super.Release() } GetElementState() { return { "text": this._text, "placeholder": this._placeholder, "title": this._title, "isEnabled": this._isEnabled, "isReadOnly": this._isReadOnly, "spellCheck": this._spellCheck, "maxLength": this._maxLength } } async _OnClick(e) { this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "click", true)); await this.TriggerAsync(C3.Plugins.TextBox.Cnds.OnClicked) } async _OnDoubleClick(e) { this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "dblclick", true)); await this.TriggerAsync(C3.Plugins.TextBox.Cnds.OnDoubleClicked) } async _OnChange(e) { this._text = e["text"]; this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "change", true)); await this.TriggerAsync(C3.Plugins.TextBox.Cnds.OnTextChanged) } _SetText(text) { if (this._text === text) return; this._text = text; this.UpdateElementState() } _GetText() { return this._text } _SetPlaceholder(placeholder) { if (this._placeholder === placeholder) return; this._placeholder = placeholder; this.UpdateElementState() } _GetPlaceholder() { return this._placeholder } _SetTooltip(title) { if (this._title === title) return; this._title = title; this.UpdateElementState() } _GetTooltip() { return this._title } _SetEnabled(e) { e = !!e; if (this._isEnabled === e) return; this._isEnabled = e; this.UpdateElementState() } _IsEnabled() { return this._isEnabled } _SetReadOnly(r) { r = !!r; if (this._isReadOnly === r) return; this._isReadOnly = r; this.UpdateElementState() } _IsReadOnly() { return this._isReadOnly } _SetMaxLength(l) { l = Math.max(+l, -1); if (this._maxLength === l) return; this._maxLength = l; this.UpdateElementState() } _GetMaxLength() { return this._maxLength } _ScrollToBottom() { this.PostToDOMElement("scroll-to-bottom") } Draw(renderer) {} SaveToJson() { return { "t": this._text, "p": this._placeholder, "ti": this._title, "e": this._isEnabled, "r": this._isReadOnly, "sp": this._spellCheck, "ml": this._maxLength, "type": this._type, "id": this._id } } LoadFromJson(o) { this._text = o["t"]; this._placeholder = o["p"]; this._title = o["ti"]; this._isEnabled = o["e"]; this._isReadOnly = o["r"]; this._spellCheck = o["sp"]; this._maxLength = o.hasOwnProperty("ml") ? o["ml"] : -1; this._type = o["type"]; this._id = o["id"]; this.UpdateElementState() } GetPropertyValueByIndex(index) { switch (index) { case TEXT: return this._text; case PLACEHOLDER: return this._placeholder; case TOOLTIP: return this._title; case ENABLE: return this._isEnabled; case READ_ONLY: return this._isReadOnly; case SPELL_CHECK: return this._spellCheck; case AUTO_FONT_SIZE: return this._autoFontSize; case ID: return this._id } } SetPropertyValueByIndex(index, value) { switch (index) { case TEXT: if (this._text === value) return; this._text = value; this.UpdateElementState(); break; case PLACEHOLDER: if (this._placeholder === value) return; this._placeholder = value; this.UpdateElementState(); break; case TOOLTIP: if (this._title === value) return; this._title = value; this.UpdateElementState(); break; case ENABLE: if (this._isEnabled === !!value) return; this._isEnabled = !!value; this.UpdateElementState(); break; case READ_ONLY: if (this._isReadOnly === !!value) return; this._isReadOnly = !!value; this.UpdateElementState(); break; case SPELL_CHECK: if (this._spellCheck === !!value) return; this._spellCheck = !!value; this.UpdateElementState(); break; case AUTO_FONT_SIZE: this._autoFontSize = !!value; break; case ID: if (this._id === value) return; this._id = value; this.UpdateElementState(); break } } GetDebuggerProperties() { const Acts = C3.Plugins.TextBox.Acts; const prefix = "plugins.textbox"; return [{ title: prefix + ".name", properties: [{ name: prefix + ".properties.text.name", value: this._text, onedit: v=>this.CallAction(Acts.SetText, v) }, { name: prefix + ".properties.enabled.name", value: this._isEnabled, onedit: v=>this.CallAction(Acts.SetEnabled, v) }, { name: prefix + ".properties.read-only.name", value: this._isReadOnly, onedit: v=>this.CallAction(Acts.SetReadOnly, v) }] }] } GetScriptInterfaceClass() { return self.ITextInputInstance } } ; const map = new WeakMap; self.ITextInputInstance = class ITextInputInstance extends self.IDOMInstance { constructor() { super(); map.set(this, self.IInstance._GetInitInst().GetSdkInstance()) } set text(str) { map.get(this)._SetText(str) } get text() { return map.get(this)._GetText() } set placeholder(str) { map.get(this)._SetPlaceholder(str) } get placeholder() { return map.get(this)._GetPlaceholder() } set tooltip(str) { map.get(this)._SetTooltip(str) } get tooltip() { return map.get(this)._GetTooltip() } set isEnabled(e) { map.get(this)._SetEnabled(e) } get isEnabled() { return map.get(this)._IsEnabled() } set isReadOnly(r) { map.get(this)._SetReadOnly(r) } get isReadOnly() { return map.get(this)._IsReadOnly() } set maxLength(l) { map.get(this)._SetMaxLength(l) } get maxLength() { return map.get(this)._GetMaxLength() } scrollToBottom() { map.get(this)._ScrollToBottom() } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TextBox.Cnds = { CompareText(text, case_) { if (case_ === 0) return C3.equalsNoCase(this._text, text); else return this._text === text }, OnTextChanged() { return true }, OnClicked() { return true }, OnDoubleClicked() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TextBox.Acts = { SetText(text) { this._SetText(text) }, AppendText(text) { if (!text) return; this._SetText(this._GetText() + text) }, SetPlaceholder(placeholder) { this._SetPlaceholder(placeholder) }, SetTooltip(title) { this._SetTooltip(title) }, SetReadOnly(r) { this._SetReadOnly(r === 0) }, ScrollToBottom() { this._ScrollToBottom() }, SetMaxLength(l) { this._SetMaxLength(l) } } } ;'use strict'; { const C3 = self.C3; C3.Plugins.TextBox.Exps = { Text() { return this._GetText() }, MaxLength() { return this._GetMaxLength() } } } ;"use strict"; { C3.Behaviors.aekiro_gameobject = class MyBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.aekiro_gameobject.Type = class MyBehaviorType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_gameobject.Instance = class MyBehaviorInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); if (properties) { this.name = properties[0]; this.parentName = properties[1]; this.parentSameLayer = properties[2]; } this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject = this; this.inst = this.GetObjectInstance(); this.wi = this.GetWorldInfo(); this.acts = this.GetObjectInstance().GetPlugin().constructor.Acts; this.eventManager = new EventManager(this.inst); this.goManager = globalThis["aekiro_goManager"]; this.userName = this.name ? this.name : null; this.areChildrenRegistred = false; this.children = []; this.parent = null; this.local = { x: this.wi.GetX(), y: this.wi.GetY(), angle: this.wi.GetAngle(), _sinA: Math.sin(this.wi.GetAngle()), _cosA: Math.cos(this.wi.GetAngle()) }; this.overrideWorldInfo(); this.prev = { x: this.wi.GetX(), y: this.wi.GetY(), angle: this.wi.GetAngle(), width: this.wi.GetWidth(), height: this.wi.GetHeight() }; if (this.goManager.isInit) { this.name = ""; this.parentName = ""; } this.goManager.addGO(this.inst); } PostCreate() {} overrideWorldInfo() { if (this.isWorldInfoOverrided) return; this.isWorldInfoOverrided = true; var inst = this.GetObjectInstance(); var wi = inst.GetWorldInfo(); wi.SetX_old = wi.SetX; wi.SetX = function(x, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.x = x; aekiro_gameobject.updateGlobals(); } else { this.SetX_old(x); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.SetY_old = wi.SetY; wi.SetY = function(y, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.y = y; aekiro_gameobject.updateGlobals(); } else { this.SetY_old(y); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.SetXY_old = wi.SetXY; wi.SetXY = function(x, y, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.x = x; aekiro_gameobject.local.y = y; aekiro_gameobject.updateGlobals(); } else { this.SetXY_old(x, y); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.OffsetX_old = wi.OffsetX; wi.OffsetX = function(x, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.x += x; aekiro_gameobject.updateGlobals(); } else { this.OffsetX_old(x); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.OffsetY_old = wi.OffsetY; wi.OffsetY = function(y, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.y += y; aekiro_gameobject.updateGlobals(); } else { this.OffsetY_old(y); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.OffsetXY_old = wi.OffsetXY; wi.OffsetXY = function(x, y, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.x += x; aekiro_gameobject.local.y += y; aekiro_gameobject.updateGlobals(); } else { this.OffsetXY_old(x, y); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.SetAngle_old = wi.SetAngle; wi.SetAngle = function(angle, isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) return; if (isLocal && aekiro_gameobject.parent) { aekiro_gameobject.local.angle = angle; aekiro_gameobject.local._sinA = Math.sin(angle); aekiro_gameobject.local._cosA = Math.cos(angle); aekiro_gameobject.updateGlobals(); } else { this.SetAngle_old(angle); aekiro_gameobject.updateLocals(); } aekiro_gameobject.children_update(); } ; wi.GetX_old = wi.GetX; wi.GetX = function(isLocal) { if (isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject.parent) { return aekiro_gameobject.local.x; } } return this.GetX_old(); } ; wi.GetY_old = wi.GetY; wi.GetY = function(isLocal) { if (isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject.parent) { return aekiro_gameobject.local.y; } } return this.GetY_old(); } ; wi.GetAngle_old = wi.GetAngle; wi.GetAngle = function(isLocal) { if (isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject.parent) { return aekiro_gameobject.local.angle; } } return this.GetAngle_old(); } ; wi.GetCosAngle_old = wi.GetCosAngle; wi.GetCosAngle = function(isLocal) { if (isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject.parent) { return aekiro_gameobject.local._cosA; } } return this.GetCosAngle_old(); } ; wi.GetSinAngle_old = wi.GetSinAngle; wi.GetSinAngle = function(isLocal) { if (isLocal) { var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject.parent) { return aekiro_gameobject.local._sinA; } } return this.GetSinAngle_old(); } ; wi.SetWidth_old = wi.SetWidth; wi.SetWidth = function(w, onlyNode) { if (onlyNode) { this.SetWidth_old(w); return; } var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; w = w == 0 ? 0.1 : w; var f = w / this.GetWidth(); this.SetWidth_old(w); var c = aekiro_gameobject.children; var l = c.length; for (var i = 0, l; i < l; i++) { wi = c[i].GetWorldInfo(); wi.SetX(wi.GetX(true) * f, true); wi.SetWidth(wi.GetWidth() * f); wi.SetBboxChanged(); } } ; wi.SetHeight_old = wi.SetHeight; wi.SetHeight = function(h, onlyNode) { if (onlyNode) { this.SetHeight_old(h); return; } var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; h = h == 0 ? 0.1 : h; var f = h / this.GetHeight(); this.SetHeight_old(h); var c = aekiro_gameobject.children; var l = c.length; for (var i = 0, l; i < l; i++) { wi = c[i].GetWorldInfo(); wi.SetY(wi.GetY(true) * f, true); wi.SetHeight(wi.GetHeight() * f); wi.SetBboxChanged(); } } ; wi.SetSize_old = wi.SetSize; wi.SetSize = function(w, h, onlyNode) { if (onlyNode) { this.SetSize_old(w, h); return; } var inst = this.GetInstance(); var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; w = w == 0 ? 0.1 : w; h = h == 0 ? 0.1 : h; var fw = h / this.GetHeight(); var fh = w / this.GetWidth(); this.SetSize_old(w, h); var c = aekiro_gameobject.children; var l = c.length; for (var i = 0, l; i < l; i++) { wi = c[i].GetWorldInfo(); wi.SetX(wi.GetX(true) * fw, true); wi.SetY(wi.GetY(true) * fh, true); wi.SetSize(wi.GetWidth() * fw, wi.GetHeight() * fh); wi.SetBboxChanged(); } } ; } children_update() { if (!this.children.length) { return; } var inst, wi, l = this.children.length; for (var i = 0; i < l; i++) { inst = this.children[i]; wi = inst.GetWorldInfo(); wi.SetXY(wi.GetX(true), wi.GetY(true), true); wi.SetAngle(wi.GetAngle(true), true); wi.SetBboxChanged(); } } children_add(inst) { var name, aekiro_gameobject; if (typeof inst === 'string') { name = inst; inst = null; } else { aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (!aekiro_gameobject) { console.error("Aekiro GameObject: You're adding a child (uid=%s) without a gameobject behavior on it.", inst.GetUID()); return; } name = aekiro_gameobject.name; } inst = this.goManager.gos[name]; if (inst == this.GetObjectInstance()) { return; } if (!inst) { console.error("Aekiro GameObject: Object of name : %s not found !", name); return; } if (name == this.parentName) { console.error("Aekiro GameObject: Cannot add %s as a child of %s, because %s is its parent !", name, this.name, name); return; } if (this.children.indexOf(inst) > -1) { console.warn("Aekiro GameObject: Object %s already have a child named %s !", this.name, name); return; } aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; aekiro_gameobject.removeFromParent(); aekiro_gameobject.parentName = this.name; aekiro_gameobject.parent = this.GetObjectInstance(); var res = this.globalToLocal(inst, this.GetObjectInstance()); aekiro_gameobject.local.x = res.x; aekiro_gameobject.local.y = res.y; aekiro_gameobject.local.angle = res.angle; this.children.push(inst); this.eventManager.emit("childrenAdded", { "args": inst, "propagate": false }); } setName(name) { try { this.goManager.setGoName(this.name, name); } catch (e) { console.error(e); return; } this.name = name; const l = this.children.length; for (var i = 0; i < l; i++) { this.children[i].GetUnsavedDataMap().aekiro_gameobject.parentName = name; } } updateLocals() { var parent = this.parent_get(); if (!parent) return; if (this.GetObjectInstance() === null) return; var res = this.globalToLocal(this.GetObjectInstance(), parent); this.local.x = res.x; this.local.y = res.y; this.local.angle = res.angle; } updateGlobals() { var parent = this.parent_get(); if (!parent) return; var res = this.localToGlobal(this.GetObjectInstance(), parent); this.wi.SetXY_old(res.x, res.y); this.wi.SetAngle_old(res.angle); } children_addFromLayer(layer) { var insts = layer._instances; var myInst = this.GetObjectInstance(); var inst, aekiro_gameobject; for (var i = 0, l = insts.length; i < l; i++) { inst = insts[i]; aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; if (inst != myInst && aekiro_gameobject && aekiro_gameobject.parentName == "") { this.children_add(inst); } } } children_addFromType(type) { var insts = type.GetCurrentSol().GetInstances(); for (var i = 0, l = insts.length; i < l; i++) { this.children_add(insts[i]); } } children_remove(inst) { var index = -1; if (typeof inst === 'string') { for (var i = 0, l = this.children.length; i < l; i++) { if (this.children[i].GetUnsavedDataMap().aekiro_gameobject.name == inst) { index = i; break; } } } else { index = this.children.indexOf(inst); } if (index != -1) { var aekiro_gameobject = this.children[index].GetUnsavedDataMap().aekiro_gameobject; aekiro_gameobject.parent = null; this.children.splice(index, 1); } } children_removeFromType(type) { var insts = type.GetCurrentSol().GetInstances(); for (var i = 0, l = insts.length; i < l; i++) { this.children_remove(insts[i]); } } removeAllChildren() { if (!this.children.length) return; var aekiro_gameobject; var l = this.children.length; for (var i = 0; i < l; i++) { aekiro_gameobject = this.children[i].GetUnsavedDataMap().aekiro_gameobject; aekiro_gameobject.parent = null; } this.children.length = 0; } removeFromParent() { var parent = this.parent; var inst = this.GetObjectInstance(); if (parent) { var aekiro_gameobject = parent.GetUnsavedDataMap().aekiro_gameobject; if (aekiro_gameobject) { aekiro_gameobject.children_remove(inst); } } } destroyHierarchy() { var runtime = this.GetRuntime(); runtime.DestroyInstance(this.GetObjectInstance()); for (var i = 0, l = this.children.length; i < l; i++) { this.children[i].GetUnsavedDataMap().aekiro_gameobject.destroyHierarchy() } this.children.length = 0; } parent_get() { if (!this.parent && this.parentName && this.name) { this.parent = this.goManager.gos[this.parentName]; } return this.parent; } getTemplate(node) { if (!node) { node = this._inst; } var template = { type: node.GetObjectClass().GetName(), x: node.GetWorldInfo().GetX(true), y: node.GetWorldInfo().GetY(true), zindex: node.GetWorldInfo().GetZIndex() + node.GetWorldInfo().GetLayer().GetIndex() * 100, json: JSON.stringify(node.SaveToJson(!0)), children: [] }; var children = node.GetUnsavedDataMap().aekiro_gameobject.children; for (var i = 0, l = children.length; i < l; i++) { template.children.push(this.getTemplate(children[i])); } return template; } hierarchyToArray(node, ar) { if (!node) { node = this.GetObjectInstance(); } if (!ar) { ar = []; } ar.push(node); var children = node.GetUnsavedDataMap().aekiro_gameobject.children; for (var i = 0, l = children.length; i < l; i++) { this.hierarchyToArray(children[i], ar); } return ar; } updateZindex() { var children = this.hierarchyToArray(); children.sort(function(a, b) { return a.GetUnsavedDataMap().zindex - b.GetUnsavedDataMap().zindex; }); var layer = children[0].GetWorldInfo().GetLayer(); for (var i = 1, l = children.length; i < l; i++) { layer.MoveInstanceAdjacent(children[i], children[i - 1], true); } this.GetRuntime().UpdateRender(); } moveToTop() { var children = this.hierarchyToArray(); children.sort(function(a, b) { return a.GetWorldInfo().GetZIndex() - b.GetWorldInfo().GetZIndex(); }); for (var i = 0, l = children.length; i < l; i++) { children[i].GetSdkInstance().CallAction(this.acts.MoveToTop); } this.GetRuntime().UpdateRender(); } moveToBottom() { var children = this.hierarchyToArray(); children.sort(function(a, b) { return b.GetWorldInfo().GetZIndex() - a.GetWorldInfo().GetZIndex(); }); for (var i = 0, l = children.length; i < l; i++) { children[i].GetSdkInstance().CallAction(this.acts.MoveToBottom); } this.GetRuntime().UpdateRender(); } setTimeScale(s) { var children = this.hierarchyToArray(); for (var i = 1, l = children.length; i < l; i++) { children[i].SetTimeScale(s); } } Tick() {} Release() {} Release2() { this.goManager.removeGO(this.name); this.removeFromParent(); for (var i = 0, l = this.children.length; i < l; i++) { this.children_remove(this.children[i]); } super.Release(); } SaveToJson() { return { "name": this.name, "parentName": this.parentName, "parentSameLayer": this.parentSameLayer, "global_x": this.wi.GetX(), "global_y": this.wi.GetY() }; } LoadFromJson(o) { this.name = o["name"]; this.parentName = o["parentName"]; this.parentSameLayer = o["parentSameLayer"]; this.wi.SetXY(o["global_x"], o["global_y"]); this.wi.SetBboxChanged(); } GetDebuggerProperties() { var children = []; for (var i = 0, l = this.children.length; i < l; i++) { children.push(this.children[i].GetUnsavedDataMap().aekiro_gameobject.name); } var children_str = JSON.stringify(children, null, "\t"); return [{ title: "aekiro_gameobject", properties: [{ name: "name", value: this.name }, { name: "parentName", value: this.parentName }, { name: "children", value: children_str }, { name: "local_x", value: this.local.x }, { name: "local_y", value: this.local.y }, { name: "local_angle", value: this.local.angle }] }]; } applyActionToHierarchy(action, v) { if (!action) return; this.GetObjectInstance().GetSdkInstance().CallAction(action, v); var h = this.children; var l = h.length; for (var i = 0; i < l; i++) { h[i].GetUnsavedDataMap().aekiro_gameobject.applyActionToHierarchy(action, v); } } SetBlendMode(bm) { this.wi.SetBlendMode(bm); var h = this.children; for (var i = 0, l = h.length; i < l; i++) { h[i].GetWorldInfo().SetBlendMode(bm); } } globalToLocal(inst, parent_inst) { var wip = parent_inst.GetWorldInfo(); return this.globalToLocal2(inst, wip.GetX(), wip.GetY(), wip.GetAngle()); } globalToLocal2(inst, p_x, p_y, p_angle) { var res = {}; var wi = inst.GetWorldInfo(); res.x = (wi.GetX() - p_x) * Math.cos(p_angle) + (wi.GetY() - p_y) * Math.sin(p_angle); res.y = -(wi.GetX() - p_x) * Math.sin(p_angle) + (wi.GetY() - p_y) * Math.cos(p_angle); res.angle = wi.GetAngle() - p_angle; return res; } localToGlobal(inst, parent_inst) { var wip = parent_inst.GetWorldInfo(); return this.localToGlobal2(inst, wip.GetX(), wip.GetY(), wip.GetAngle()); } localToGlobal2(inst, p_x, p_y, p_angle) { var res = {}; var aekiro_gameobject = inst.GetUnsavedDataMap().aekiro_gameobject; res.x = p_x + aekiro_gameobject.local.x * Math.cos(p_angle) - aekiro_gameobject.local.y * Math.sin(p_angle); res.y = p_y + aekiro_gameobject.local.x * Math.sin(p_angle) + aekiro_gameobject.local.y * Math.cos(p_angle); res.angle = p_angle + aekiro_gameobject.local.angle; return res; } localToGlobal_x() { var parent = this.parent_get(); if (parent) { var wp = parent.GetWorldInfo(); var x = wp.GetX() + this.local.x * Math.cos(wp.GetAngle()) - this.local.y * Math.sin(wp.GetAngle()); return x; } else { return wp.GetX(); } } localToGlobal_y() { var parent = this.parent_get(); if (parent) { var wp = parent.GetWorldInfo(); var y = wp.GetY("g") + this.local.x * Math.sin(wp.GetAngle("g")) + this.local.y * Math.cos(wp.GetAngle("g")); return y; } else { return this.local.y; } } localToGlobal_angle() { var parent = this.parent_get(); if (parent) { var wp = parent.GetWorldInfo(); var angle = wp.GetAngle("g") + this.local.angle; return angle; } else { return this.local.angle; } } } ; } "use strict"; { C3.Behaviors.aekiro_gameobject.Cnds = { IsName(name) { return name == this.name; }, IsParentName(name) { return name == this.parentName; }, OnCloned() { return true; } }; } "use strict"; { C3.Behaviors.aekiro_gameobject.Acts = { Clone(layer, x, y, name, parentName) { var template = this.getTemplate(); var inst = aekiro_goManager.clone(template, name, parentName, layer, x, y); inst.GetUnsavedDataMap().aekiro_gameobject.updateZindex(); }, SetName(name) { this.setName(name); }, AddChildrenFromLayer(layer) { this.children_addFromLayer(layer); }, AddChildrenFromType(type) { this.children_addFromType(type); }, AddChildByName(name) { this.children_add(name); }, RemoveChildByName(name) { this.children_remove(name); }, RemoveChildByType(type) { this.children_removeFromType(type); }, RemoveFromParent() { this.removeFromParent(); }, RemoveAllchildren() { this.removeAllChildren(); }, SetOpacity(v) { this.applyActionToHierarchy(this.acts.SetOpacity, v); }, SetVisible(v) { this.applyActionToHierarchy(this.acts.SetVisible, v); }, SetColor(v) { this.applyActionToHierarchy(this.acts.SetDefaultColor, v); }, SetMirrored(v) { this.applyActionToHierarchy(this.acts.SetMirrored, v); }, SetFlipped(v) { this.applyActionToHierarchy(this.acts.SetFlipped, v); }, MoveToLayer(v) { this.applyActionToHierarchy(this.acts.MoveToLayer, v); }, MoveToTop() { this.moveToTop(); }, MoveToBottom() { this.moveToBottom(); }, SetZElevation(v) { this.applyActionToHierarchy(this.acts.SetZElevation, v); }, SetEffect(v) { this.SetBlendMode(v); }, SetWidth(v) { this.wi.SetWidth(v, true); this.wi.SetBboxChanged(); }, SetHeight(v) { this.wi.SetHeight(v, true); this.wi.SetBboxChanged(); }, Destroy() { this.destroyHierarchy(); }, SetLocalX(v) { this.wi.SetX(v, true); this.wi.SetBboxChanged(); }, SetLocalY(v) { this.wi.SetY(v, true); this.wi.SetBboxChanged(); }, SetLocalAngle(v) { this.wi.SetAngle(v, true); this.wi.SetBboxChanged(); } }; } "use strict"; { C3.Behaviors.aekiro_gameobject.Exps = { name() { return this.name; }, parent() { return this.parentName; }, asjson() { var t = this.getTemplate(); return JSON.stringify(t); }, globalX() { return this.GetObjectInstance().GetWorldInfo().GetX_old(); }, globalY() { return this.GetObjectInstance().GetWorldInfo().GetY_old(); }, globalAngle() { return this.GetObjectInstance().GetWorldInfo().GetAngle_old(); }, localX() { return this.wi.GetX(true); }, localY() { return this.wi.GetY(true); }, localAngle() { return this.wi.GetAngle(true); } }; } 'use strict'; { const C3 = self.C3; C3.Behaviors.MoveTo = class MoveToBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.MoveTo.Type = class MoveToType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const IBehaviorInstance = self.IBehaviorInstance; const PROP_MAX_SPEED = 0; const PROP_ACCELERATION = 1; const PROP_DECELERATION = 2; const PROP_ROTATE_SPEED = 3; const PROP_SET_ANGLE = 4; const PROP_STOP_ON_SOLIDS = 5; const PROP_ENABLED = 6; C3.Behaviors.MoveTo.Instance = class MoveToInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._maxSpeed = 200; this._acc = 600; this._dec = 600; this._rotateSpeed = 0; this._setAngle = true; this._stopOnSolids = false; this._isEnabled = true; this._speed = 0; this._movingAngle = this.GetWorldInfo().GetAngle(); this._waypoints = []; if (properties) { this._maxSpeed = properties[PROP_MAX_SPEED]; this._acc = properties[PROP_ACCELERATION]; this._dec = properties[PROP_DECELERATION]; this._rotateSpeed = C3.toRadians(properties[PROP_ROTATE_SPEED]); this._setAngle = properties[PROP_SET_ANGLE]; this._stopOnSolids = properties[PROP_STOP_ON_SOLIDS]; this._isEnabled = properties[PROP_ENABLED] } } Release() { super.Release() } SaveToJson() { return { "ms": this._maxSpeed, "acc": this._acc, "dec": this._dec, "rs": this._rotateSpeed, "sa": this._setAngle, "sos": this._stopOnSolids, "s": this._speed, "ma": this._movingAngle, "wp": this._waypoints.map(p=>({ "x": p.x, "y": p.y })), "e": this._isEnabled } } LoadFromJson(o) { this._maxSpeed = o["ms"]; this._acc = o["acc"]; this._dec = o["dec"]; this._rotateSpeed = o["rs"]; this._setAngle = o["sa"]; this._stopOnSolids = o["sos"]; this._speed = o["s"]; this._movingAngle = o["ma"]; this._waypoints = o["wp"].map(p=>({ x: p["x"], y: p["y"] })); this._SetEnabled(o["e"]); if (this._isEnabled && this._waypoints.length > 0) this._StartTicking() } _AddWaypoint(x, y, isDirect) { if (isDirect) C3.clearArray(this._waypoints); this._waypoints.push({ x, y }); if (this._isEnabled) this._StartTicking() } _GetWaypointCount() { return this._waypoints.length } _GetWaypointXAt(i) { i = Math.floor(i); if (i < 0 || i >= this._waypoints.length) return 0; return this._waypoints[i].x } _GetWaypointYAt(i) { i = Math.floor(i); if (i < 0 || i >= this._waypoints.length) return 0; return this._waypoints[i].y } _IsMoving() { return this._waypoints.length > 0 } _Stop() { C3.clearArray(this._waypoints); this._speed = 0; this._StopTicking() } _GetTargetX() { if (this._waypoints.length > 0) return this._waypoints[0].x; else return 0 } _GetTargetY() { if (this._waypoints.length > 0) return this._waypoints[0].y; else return 0 } _SetSpeed(s) { if (!this._IsMoving()) return; this._speed = Math.min(s, this._maxSpeed) } _GetSpeed() { return this._speed } _SetMaxSpeed(ms) { this._maxSpeed = Math.max(ms, 0); this._SetSpeed(this._speed) } _GetMaxSpeed() { return this._maxSpeed } _IsRotationEnabled() { return this._rotateSpeed !== 0 } Tick() { if (!this._isEnabled || !this._IsMoving()) return; const dt = this._runtime.GetDt(this._inst); const wi = this._inst.GetWorldInfo(); const startX = wi.GetX(); const startY = wi.GetY(); const startAngle = wi.GetAngle(); let curSpeed = this._speed; let maxSpeed = this._maxSpeed; const acc = this._acc; const dec = this._dec; const targetX = this._GetTargetX(); const targetY = this._GetTargetY(); const angleToTarget = C3.angleTo(startX, startY, targetX, targetY); let isWithinStoppingDistance = false; if (dec > 0 && this._waypoints.length === 1) { const stoppingDist = .5 * curSpeed * curSpeed / dec * 1.0001; isWithinStoppingDistance = C3.distanceSquared(startX, startY, targetX, targetY) <= stoppingDist * stoppingDist; if (isWithinStoppingDistance) { const remainingDist = C3.distanceTo(startX, startY, targetX, targetY); curSpeed = Math.sqrt(2 * dec * remainingDist); maxSpeed = curSpeed; this._speed = curSpeed } } if (this._IsRotationEnabled()) { const da = C3.angleDiff(this._movingAngle, angleToTarget); if (da > Number.EPSILON) { const t = da / this._rotateSpeed; const dist = C3.distanceTo(wi.GetX(), wi.GetY(), targetX, targetY); const r = dist / (2 * Math.sin(da)); const curveDist = r * da; maxSpeed = Math.min(maxSpeed, C3.clamp(curveDist / t, 0, this._maxSpeed)) } } let curAcc = isWithinStoppingDistance ? -dec : acc; const stepDist = Math.min(curSpeed * dt + .5 * curAcc * dt * dt, maxSpeed * dt); if (isWithinStoppingDistance) { if (dec > 0) { this._speed = Math.max(this._speed - dec * dt, 0); if (this._speed === 0) { this._OnArrived(wi, targetX, targetY); return } } } else if (acc === 0) this._speed = maxSpeed; else this._speed = Math.min(this._speed + acc * dt, maxSpeed); if (C3.distanceSquared(wi.GetX(), wi.GetY(), targetX, targetY) <= stepDist * stepDist) { this._OnArrived(wi, targetX, targetY); return } if (this._IsRotationEnabled()) this._movingAngle = C3.angleRotate(this._movingAngle, angleToTarget, this._rotateSpeed * dt); else this._movingAngle = angleToTarget; wi.OffsetXY(Math.cos(this._movingAngle) * stepDist, Math.sin(this._movingAngle) * stepDist); if (this._setAngle) wi.SetAngle(this._movingAngle); wi.SetBboxChanged(); this._CheckSolidCollision(startX, startY, startAngle) } _OnArrived(wi, targetX, targetY) { wi.SetXY(targetX, targetY); wi.SetBboxChanged(); this._waypoints.shift(); if (this._waypoints.length === 0) { this._speed = 0; this._StopTicking() } this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "arrived")); this.Trigger(C3.Behaviors.MoveTo.Cnds.OnArrived) } _CheckSolidCollision(startX, startY, startAngle) { const collisionEngine = this._runtime.GetCollisionEngine(); if (this._stopOnSolids && collisionEngine.TestOverlapSolid(this._inst)) { this._Stop(); const wi = this._inst.GetWorldInfo(); const x = wi.GetX(); const y = wi.GetY(); const a = C3.angleTo(x, y, startX, startY); const dist = C3.distanceTo(x, y, startX, startY); if (!collisionEngine.PushOutSolid(this._inst, Math.cos(a), Math.sin(a), Math.max(dist, 1))) { wi.SetXY(startX, startY); wi.SetAngle(startAngle); wi.SetBboxChanged() } this.GetScriptInterface().dispatchEvent(C3.New(C3.Event, "hitsolid")); this.Trigger(C3.Behaviors.MoveTo.Cnds.OnHitSolid) } } _IsSetAngle() { return this._setAngle } _SetSetAngle(a) { this._setAngle = !!a } _SetAngleOfMotion(a) { this._movingAngle = a; if (this._isEnabled && this._setAngle && !this._IsMoving()) { const wi = this.GetWorldInfo(); wi.SetAngle(this._movingAngle); wi.SetBboxChanged() } } _GetAngleOfMotion() { return this._movingAngle } _SetAcceleration(a) { this._acc = Math.max(a, 0) } _GetAcceleration() { return this._acc } _SetDeceleration(d) { this._dec = Math.max(d, 0) } _GetDeceleration() { return this._dec } _SetRotateSpeed(r) { this._rotateSpeed = Math.max(r, 0) } _GetRotateSpeed() { return this._rotateSpeed } _SetStopOnSolids(e) { this._stopOnSolids = !!e } _IsStopOnSolids() { return this._stopOnSolids } _SetEnabled(e) { e = !!e; if (this._isEnabled === e) return; this._isEnabled = e; if (this._isEnabled && this._IsMoving()) this._StartTicking(); else this._StopTicking() } _IsEnabled() { return this._isEnabled } GetPropertyValueByIndex(index) { switch (index) { case PROP_MAX_SPEED: return this._GetMaxSpeed(); case PROP_ACCELERATION: return this._GetAcceleration(); case PROP_DECELERATION: return this._GetDeceleration(); case PROP_ROTATE_SPEED: return C3.toDegrees(this._GetRotateSpeed()); case PROP_SET_ANGLE: return this._IsSetAngle(); case PROP_STOP_ON_SOLIDS: return this._IsStopOnSolids(); case PROP_ENABLED: return this._IsEnabled() } } SetPropertyValueByIndex(index, value) { switch (index) { case PROP_MAX_SPEED: this._SetMaxSpeed(value); break; case PROP_ACCELERATION: this._SetAcceleration(value); break; case PROP_DECELERATION: this._SetDeceleration(value); break; case PROP_ROTATE_SPEED: this._SetRotateSpeed(C3.toRadians(value)); break; case PROP_SET_ANGLE: this._SetSetAngle(value); break; case PROP_STOP_ON_SOLIDS: this._SetStopOnSolids(value); break; case PROP_ENABLED: this._SetEnabled(value); break } } GetDebuggerProperties() { const prefix = "behaviors.moveto"; return [{ title: "$" + this.GetBehaviorType().GetName(), properties: [{ name: prefix + ".debugger.speed", value: this._GetSpeed(), onedit: v=>this._SetSpeed(v) }, { name: prefix + ".debugger.angle-of-motion", value: C3.toDegrees(this._GetAngleOfMotion()), onedit: v=>this._movingAngle = C3.toRadians(v) }, { name: prefix + ".debugger.target-x", value: this._GetTargetX() }, { name: prefix + ".debugger.target-y", value: this._GetTargetY() }, { name: prefix + ".debugger.waypoint-count", value: this._GetWaypointCount() }, { name: prefix + ".properties.max-speed.name", value: this._GetMaxSpeed(), onedit: v=>this._SetMaxSpeed(v) }, { name: prefix + ".properties.acceleration.name", value: this._GetAcceleration(), onedit: v=>this._SetAcceleration(v) }, { name: prefix + ".properties.deceleration.name", value: this._GetDeceleration(), onedit: v=>this._SetDeceleration(v) }, { name: prefix + ".properties.rotate-speed.name", value: C3.toDegrees(this._GetRotateSpeed()), onedit: v=>this._SetRotateSpeed(C3.toRadians(v)) }, { name: prefix + ".properties.enabled.name", value: this._IsEnabled(), onedit: v=>this._SetEnabled(v) }] }] } GetScriptInterfaceClass() { return self.IMoveToBehaviorInstance } } ; const map = new WeakMap; self.IMoveToBehaviorInstance = class IMoveToBehaviorInstance extends IBehaviorInstance { constructor() { super(); map.set(this, IBehaviorInstance._GetInitInst().GetSdkInstance()) } moveToPosition(x, y, isDirect=true) { map.get(this)._AddWaypoint(x, y, !!isDirect) } getTargetX() { return map.get(this)._GetTargetX() } getTargetY() { return map.get(this)._GetTargetY() } getTargetPosition() { const b = map.get(this); return [b._GetTargetX(), b._GetTargetY()] } getWaypointCount() { return map.get(this)._GetWaypointCount() } getWaypointX(i) { return map.get(this)._GetWaypointXAt(+i) } getWaypointY(i) { return map.get(this)._GetWaypointYAt(+i) } getWaypoint(i) { i = +i; const b = map.get(this); return [b._GetWaypointXAt(i), b._GetWaypointYAt(i)] } stop() { map.get(this)._Stop() } get isMoving() { return map.get(this)._IsMoving() } get speed() { return map.get(this)._GetSpeed() } set speed(s) { map.get(this)._SetSpeed(s) } get maxSpeed() { return map.get(this)._GetMaxSpeed() } set maxSpeed(ms) { map.get(this)._SetMaxSpeed(ms) } get acceleration() { return map.get(this)._GetAcceleration() } set acceleration(a) { map.get(this)._SetAcceleration(a) } get deceleration() { return map.get(this)._GetDeceleration() } set deceleration(d) { map.get(this)._SetDeceleration(d) } get angleOfMotion() { return map.get(this)._GetAngleOfMotion() } set angleOfMotion(a) { map.get(this)._SetAngleOfMotion(a) } get rotateSpeed() { return map.get(this)._GetRotateSpeed() } set rotateSpeed(r) { map.get(this)._SetRotateSpeed(r) } get isStopOnSolids() { return map.get(this)._IsStopOnSolids() } set isStopOnSolids(e) { map.get(this)._SetStopOnSolids(e) } get isEnabled() { return map.get(this)._IsEnabled() } set isEnabled(e) { map.get(this)._SetEnabled(e) } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.MoveTo.Cnds = { IsMoving() { return this._IsMoving() }, CompareSpeed(cmp, s) { return C3.compare(this._GetSpeed(), cmp, s) }, IsEnabled() { return this._IsEnabled() }, OnArrived() { return true }, OnHitSolid() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.MoveTo.Acts = { MoveToPosition(x, y, mode) { this._AddWaypoint(x, y, mode === 0) }, MoveToObject(objectClass, imgPt, mode) { if (!objectClass) return; const inst = objectClass.GetPairedInstance(this._inst); if (!inst || !inst.GetWorldInfo()) return; const [x,y] = inst.GetImagePoint(imgPt); this._AddWaypoint(x, y, mode === 0) }, MoveAlongPathfindingPath(mode) { const behInst = this._inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.Pathfinding); if (!behInst) return; const path = behInst._GetPath(); if (path.length === 0) return; for (let i = 0, len = path.length; i < len; ++i) { const n = path[i]; this._AddWaypoint(n.x, n.y, i === 0 && mode === 0) } }, MoveAlongTimeline(timeline, trackId, mode) { let trackState = null; if (trackId) trackState = timeline.GetTrackById(trackId); else trackState = C3.first(timeline.GetTracks()); if (!trackState) return; const xTrack = trackState.GetPropertyTrack("offsetX"); const yTrack = trackState.GetPropertyTrack("offsetY"); if (!xTrack || !yTrack) return; const xPositions = [...xTrack.GetPropertyKeyframeValues()]; const yPositions = [...yTrack.GetPropertyKeyframeValues()]; if (xPositions.length === 0 || yPositions.length === 0) return; let xOrigin = 0; let yOrigin = 0; const wi = this._inst.GetWorldInfo(); if (xTrack.GetResultMode() === "relative") xOrigin = wi.GetX(); if (yTrack.GetResultMode() === "relative") yOrigin = wi.GetY(); for (let i = 0, len = Math.min(xPositions.length, yPositions.length); i < len; ++i) { const x = xPositions[i] + xOrigin; const y = yPositions[i] + yOrigin; this._AddWaypoint(x, y, i === 0 && mode === 0) } }, MoveAlongTimelineByName(timelineName, trackId, mode) { const timeline = this._runtime.GetTimelineManager().GetTimelineByName(timelineName); if (!timeline) return; C3.Behaviors.MoveTo.Acts.MoveAlongTimeline.call(this, timeline, trackId, mode) }, Stop() { this._Stop() }, SetMovingAngle(a) { this._SetAngleOfMotion(C3.toRadians(a)) }, SetSpeed(s) { this._SetSpeed(s) }, SetMaxSpeed(ms) { this._SetMaxSpeed(ms) }, SetAcceleration(a) { this._SetAcceleration(a) }, SetDeceleration(d) { this._SetDeceleration(d) }, SetRotateSpeed(r) { this._SetRotateSpeed(C3.toRadians(r)) }, SetStopOnSolids(e) { this._SetStopOnSolids(e) }, SetEnabled(e) { this._SetEnabled(e) } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.MoveTo.Exps = { Speed() { return this._GetSpeed() }, MaxSpeed() { return this._GetMaxSpeed() }, Acceleration() { return this._GetAcceleration() }, Deceleration() { return this._GetDeceleration() }, MovingAngle() { return C3.toDegrees(this._GetAngleOfMotion()) }, RotateSpeed() { return C3.toDegrees(this._GetRotateSpeed()) }, TargetX() { return this._GetTargetX() }, TargetY() { return this._GetTargetY() }, WaypointCount() { return this._GetWaypointCount() }, WaypointXAt(i) { return this._GetWaypointXAt(i) }, WaypointYAt(i) { return this._GetWaypointYAt(i) } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Fade = class FadeBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Fade.Type = class FadeType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const FADE_IN_TIME = 0; const WAIT_TIME = 1; const FADE_OUT_TIME = 2; const DESTROY = 3; const ACTIVE_AT_START = 4; C3.Behaviors.Fade.Instance = class FadeInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._fadeInTime = 0; this._waitTime = 0; this._fadeOutTime = 0; this._destroy = true; this._activeAtStart = true; this._setMaxOpacity = false; this._stage = 0; this._stageTime = C3.New(C3.KahanSum); this._maxOpacity = this._inst.GetWorldInfo().GetOpacity() || 1; if (properties) { this._fadeInTime = properties[FADE_IN_TIME]; this._waitTime = properties[WAIT_TIME]; this._fadeOutTime = properties[FADE_OUT_TIME]; this._destroy = !!properties[DESTROY]; this._activeAtStart = !!properties[ACTIVE_AT_START]; this._stage = this._activeAtStart ? 0 : 3 } if (this._activeAtStart) if (this._fadeInTime === 0) { this._stage = 1; if (this._waitTime === 0) this._stage = 2 } else { this._inst.GetWorldInfo().SetOpacity(0); this._runtime.UpdateRender() } this._StartTicking() } Release() { super.Release() } SaveToJson() { return { "fit": this._fadeInTime, "wt": this._waitTime, "fot": this._fadeOutTime, "d": this._destroy, "s": this._stage, "st": this._stageTime.Get(), "mo": this._maxOpacity } } LoadFromJson(o) { this._fadeInTime = o["fit"]; this._waitTime = o["wt"]; this._fadeOutTime = o["fot"]; this._destroy = o["d"]; this._stage = o["s"]; this._stageTime.Set(o["st"]); this._maxOpacity = o["mo"] } Tick() { const dt = this._runtime.GetDt(this._inst); this._stageTime.Add(dt); const wi = this._inst.GetWorldInfo(); if (this._stage === 0) { wi.SetOpacity(this._stageTime.Get() / this._fadeInTime * this._maxOpacity); this._runtime.UpdateRender(); if (wi.GetOpacity() >= this._maxOpacity) { wi.SetOpacity(this._maxOpacity); this._stage = 1; this._stageTime.Reset(); this.Trigger(C3.Behaviors.Fade.Cnds.OnFadeInEnd) } } if (this._stage === 1) if (this._stageTime.Get() >= this._waitTime) { this._stage = 2; this._stageTime.Reset(); this.Trigger(C3.Behaviors.Fade.Cnds.OnWaitEnd) } if (this._stage === 2) if (this._fadeOutTime !== 0) { wi.SetOpacity(this._maxOpacity - this._stageTime.Get() / this._fadeOutTime * this._maxOpacity); this._runtime.UpdateRender(); if (wi.GetOpacity() <= 0) { this._stage = 3; this._stageTime.Reset(); this.Trigger(C3.Behaviors.Fade.Cnds.OnFadeOutEnd); if (this._destroy) this._runtime.DestroyInstance(this._inst) } } } Start() { this._stage = 0; this._stageTime.Reset(); if (this._fadeInTime === 0) { this._stage = 1; if (this._waitTime === 0) this._stage = 2 } else { this._inst.GetWorldInfo().SetOpacity(0); this._runtime.UpdateRender() } } GetPropertyValueByIndex(index) { switch (index) { case FADE_IN_TIME: return this._fadeInTime; case WAIT_TIME: return this._waitTime; case FADE_OUT_TIME: return this._fadeOutTime; case DESTROY: return this._destroy } } SetPropertyValueByIndex(index, value) { switch (index) { case FADE_IN_TIME: this._fadeInTime = value; break; case WAIT_TIME: this._waitTime = value; break; case FADE_OUT_TIME: this._fadeOutTime = value; break; case DESTROY: this._destroy = !!value; break } } GetDebuggerProperties() { const prefix = "behaviors.fade"; return [{ title: "$" + this.GetBehaviorType().GetName(), properties: [{ name: prefix + ".properties.fade-in-time.name", value: this._fadeInTime, onedit: v=>this._fadeInTime = v }, { name: prefix + ".properties.wait-time.name", value: this._waitTime, onedit: v=>this._waitTime = v }, { name: prefix + ".properties.fade-out-time.name", value: this._fadeOutTime, onedit: v=>this._fadeOutTime = v }, { name: prefix + ".debugger.stage", value: [prefix + ".debugger." + ["fade-in", "wait", "fade-out", "done"][this._stage]] }] }] } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Fade.Cnds = { OnFadeOutEnd() { return true }, OnFadeInEnd() { return true }, OnWaitEnd() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Fade.Acts = { StartFade() { if (!this._activeAtStart && !this._setMaxOpacity) { this._maxOpacity = this._inst.GetWorldInfo().GetOpacity() || 1; this._setMaxOpacity = true } if (this._stage === 3) this.Start() }, RestartFade() { this.Start() }, SetFadeInTime(t) { if (t < 0) t = 0; this._fadeInTime = t }, SetWaitTime(t) { if (t < 0) t = 0; this._waitTime = t }, SetFadeOutTime(t) { if (t < 0) t = 0; this._fadeOutTime = t } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Fade.Exps = { FadeInTime() { return this._fadeInTime }, WaitTime() { return this._waitTime }, FadeOutTime() { return this._fadeOutTime } } } ;"use strict"; { C3.Behaviors.aekiro_gridviewbind = class aekiro_gridviewbindBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.aekiro_gridviewbind.Type = class aekiro_gridviewbindType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_gridviewbind.Instance = class aekiro_bindInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this.GetObjectInstance().GetUnsavedDataMap().aekiro_gridviewbind = this; this.index = -1; this.gridView = null; this.value = 0; } setValue(value) { this.value = value; } triggerOnGridViewRender() { this.Trigger(C3.Behaviors.aekiro_gridviewbind.Cnds.OnGridViewRender); } Release() { super.Release(); } SaveToJson() { return {}; } LoadFromJson(o) {} } ; } "use strict"; { C3.Behaviors.aekiro_gridviewbind.Cnds = { IsIndex(index) { return (index == this.index); }, OnGridViewRender() { return true; } }; } "use strict"; { C3.Behaviors.aekiro_gridviewbind.Acts = {}; } "use strict"; { C3.Behaviors.aekiro_gridviewbind.Exps = { index() { return this.index; }, get(key) { var v = self["_"]["get"](this.value, key); if (v == undefined) { return ""; } else { return v; } } }; } 'use strict'; { const C3 = self.C3; C3.Behaviors.Pin = class PinBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Pin.Type = class PinType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Pin.Instance = class PinInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._pinInst = null; this._pinUid = -1; this._mode = ""; this._propSet = new Set; this._pinDist = 0; this._pinAngle = 0; this._pinImagePoint = 0; this._dx = 0; this._dy = 0; this._dWidth = 0; this._dHeight = 0; this._dAngle = 0; this._dz = 0; this._lastKnownAngle = 0; this._destroy = false; if (properties) this._destroy = properties[0]; const rt = this._runtime.Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "instancedestroy", e=>this._OnInstanceDestroyed(e.instance)),C3.Disposable.From(rt, "afterload", e=>this._OnAfterLoad())) } Release() { this._pinInst = null; super.Release() } _SetPinInst(inst) { if (inst) { this._pinInst = inst; this._StartTicking2() } else { this._pinInst = null; this._StopTicking2() } } _Pin(objectClass, mode, propList) { if (!objectClass) return; const otherInst = objectClass.GetFirstPicked(this._inst); if (!otherInst) return; this._mode = mode; this._SetPinInst(otherInst); const myWi = this._inst.GetWorldInfo(); const otherWi = otherInst.GetWorldInfo(); if (this._mode === "properties") { const propSet = this._propSet; propSet.clear(); for (const p of propList) propSet.add(p); this._dx = myWi.GetX() - otherWi.GetX(); this._dy = myWi.GetY() - otherWi.GetY(); this._dAngle = myWi.GetAngle() - otherWi.GetAngle(); this._lastKnownAngle = myWi.GetAngle(); this._dz = myWi.GetZElevation() - otherWi.GetZElevation(); if (propSet.has("x") && propSet.has("y")) { this._pinAngle = C3.angleTo(otherWi.GetX(), otherWi.GetY(), myWi.GetX(), myWi.GetY()) - otherWi.GetAngle(); this._pinDist = C3.distanceTo(otherWi.GetX(), otherWi.GetY(), myWi.GetX(), myWi.GetY()) } if (propSet.has("width-abs")) this._dWidth = myWi.GetWidth() - otherWi.GetWidth(); else if (propSet.has("width-scale")) this._dWidth = myWi.GetWidth() / otherWi.GetWidth(); if (propSet.has("height-abs")) this._dHeight = myWi.GetHeight() - otherWi.GetHeight(); else if (propSet.has("height-scale")) this._dHeight = myWi.GetHeight() / otherWi.GetHeight() } else this._pinDist = C3.distanceTo(otherWi.GetX(), otherWi.GetY(), myWi.GetX(), myWi.GetY()) } SaveToJson() { const propSet = this._propSet; const mode = this._mode; const ret = { "uid": this._pinInst ? this._pinInst.GetUID() : -1, "m": mode }; if (mode === "rope" || mode === "bar") ret["pd"] = this._pinDist; else if (mode === "properties") { ret["ps"] = [...this._propSet]; if (propSet.has("imagepoint")) ret["ip"] = this._pinImagePoint; else if (propSet.has("x") && propSet.has("y")) { ret["pa"] = this._pinAngle; ret["pd"] = this._pinDist } else { if (propSet.has("x")) ret["dx"] = this._dx; if (propSet.has("y")) ret["dy"] = this._dy } if (propSet.has("angle")) { ret["da"] = this._dAngle; ret["lka"] = this._lastKnownAngle } if (propSet.has("width-abs") || propSet.has("width-scale")) ret["dw"] = this._dWidth; if (propSet.has("height-abs") || propSet.has("height-scale")) ret["dh"] = this._dHeight; if (propSet.has("z")) ret["dz"] = this._dz } return ret } LoadFromJson(o) { const mode = o["m"]; const propSet = this._propSet; propSet.clear(); this._pinUid = o["uid"]; if (typeof mode === "number") { this._LoadFromJson_Legacy(o); return } this._mode = mode; if (mode === "rope" || mode === "bar") this._pinDist = o["pd"]; else if (mode === "properties") { for (const p of o["ps"]) propSet.add(p); if (propSet.has("imagepoint")) this._pinImagePoint = o["ip"]; else if (propSet.has("x") && propSet.has("y")) { this._pinAngle = o["pa"]; this._pinDist = o["pd"] } else { if (propSet.has("x")) this._dx = o["dx"]; if (propSet.has("y")) this._dy = o["dy"] } if (propSet.has("angle")) { this._dAngle = o["da"]; this._lastKnownAngle = o["lka"] || 0 } if (propSet.has("width-abs") || propSet.has("width-scale")) this._dWidth = o["dw"]; if (propSet.has("height-abs") || propSet.has("height-scale")) this._dHeight = o["dh"]; if (propSet.has("z")) this._dz = o["dz"] } } _LoadFromJson_Legacy(o) { const propSet = this._propSet; const myStartAngle = o["msa"]; const theirStartAngle = o["tsa"]; const pinAngle = o["pa"]; const pinDist = o["pd"]; const mode = o["m"]; switch (mode) { case 0: this._mode = "properties"; propSet.add("x").add("y").add("angle"); this._pinAngle = pinAngle; this._pinDist = pinDist; this._dAngle = myStartAngle - theirStartAngle; this._lastKnownAngle = o["lka"]; break; case 1: this._mode = "properties"; propSet.add("x").add("y"); this._pinAngle = pinAngle; this._pinDist = pinDist; break; case 2: this._mode = "properties"; propSet.add("angle"); this._dAngle = myStartAngle - theirStartAngle; this._lastKnownAngle = o["lka"]; break; case 3: this._mode = "rope"; this._pinDist = o["pd"]; break; case 4: this._mode = "bar"; this._pinDist = o["pd"]; break } } _OnAfterLoad() { if (this._pinUid === -1) this._SetPinInst(null); else { this._SetPinInst(this._runtime.GetInstanceByUID(this._pinUid)); this._pinUid = -1 } } _OnInstanceDestroyed(inst) { if (this._pinInst === inst) { this._SetPinInst(null); if (this._destroy) this._runtime.DestroyInstance(this._inst) } } Tick2() { const pinInst = this._pinInst; if (!pinInst) return; const pinWi = pinInst.GetWorldInfo(); const myInst = this._inst; const myWi = myInst.GetWorldInfo(); const mode = this._mode; let bboxChanged = false; if (mode === "rope" || mode === "bar") { const dist = C3.distanceTo(myWi.GetX(), myWi.GetY(), pinWi.GetX(), pinWi.GetY()); if (dist > this._pinDist || mode === "bar" && dist < this._pinDist) { const a = C3.angleTo(pinWi.GetX(), pinWi.GetY(), myWi.GetX(), myWi.GetY()); myWi.SetXY(pinWi.GetX() + Math.cos(a) * this._pinDist, pinWi.GetY() + Math.sin(a) * this._pinDist); bboxChanged = true } } else { const propSet = this._propSet; let v = 0; if (propSet.has("imagepoint")) { const [newX,newY] = pinInst.GetImagePoint(this._pinImagePoint); if (!myWi.EqualsXY(newX, newY)) { myWi.SetXY(newX, newY); bboxChanged = true } } else if (propSet.has("x") && propSet.has("y")) { const newX = pinWi.GetX() + Math.cos(pinWi.GetAngle() + this._pinAngle) * this._pinDist; const newY = pinWi.GetY() + Math.sin(pinWi.GetAngle() + this._pinAngle) * this._pinDist; if (!myWi.EqualsXY(newX, newY)) { myWi.SetXY(newX, newY); bboxChanged = true } } else { v = pinWi.GetX() + this._dx; if (propSet.has("x") && v !== myWi.GetX()) { myWi.SetX(v); bboxChanged = true } v = pinWi.GetY() + this._dy; if (propSet.has("y") && v !== myWi.GetY()) { myWi.SetY(v); bboxChanged = true } } if (propSet.has("angle")) { if (this._lastKnownAngle !== myWi.GetAngle()) this._dAngle = C3.clampAngle(this._dAngle + (myWi.GetAngle() - this._lastKnownAngle)); v = C3.clampAngle(pinWi.GetAngle() + this._dAngle); if (v !== myWi.GetAngle()) { myWi.SetAngle(v); bboxChanged = true } this._lastKnownAngle = myWi.GetAngle() } if (propSet.has("width-abs")) { v = pinWi.GetWidth() + this._dWidth; if (v !== myWi.GetWidth()) { myWi.SetWidth(v); bboxChanged = true } } if (propSet.has("width-scale")) { v = pinWi.GetWidth() * this._dWidth; if (v !== myWi.GetWidth()) { myWi.SetWidth(v); bboxChanged = true } } if (propSet.has("height-abs")) { v = pinWi.GetHeight() + this._dHeight; if (v !== myWi.GetHeight()) { myWi.SetHeight(v); bboxChanged = true } } if (propSet.has("height-scale")) { v = pinWi.GetHeight() * this._dHeight; if (v !== myWi.GetHeight()) { myWi.SetHeight(v); bboxChanged = true } } if (propSet.has("z")) { v = pinWi.GetZElevation() + this._dz; if (v !== myWi.GetZElevation()) { myWi.SetZElevation(v); this._runtime.UpdateRender() } } } if (bboxChanged) myWi.SetBboxChanged() } GetDebuggerProperties() { const prefix = "behaviors.pin.debugger"; return [{ title: "$" + this.GetBehaviorType().GetName(), properties: [{ name: prefix + ".is-pinned", value: !!this._pinInst }, { name: prefix + ".pinned-uid", value: this._pinInst ? this._pinInst.GetUID() : 0 }] }] } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Pin.Cnds = { IsPinned() { return !!this._pinInst }, WillDestroy() { return this._destroy } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Pin.Acts = { PinByDistance(objectClass, mode) { this._Pin(objectClass, mode === 0 ? "rope" : "bar") }, PinByProperties(objectClass, ex, ey, ea, ew, eh, ez) { const propList = []; if (ex) propList.push("x"); if (ey) propList.push("y"); if (ea) propList.push("angle"); if (ez) propList.push("z"); if (ew === 1) propList.push("width-abs"); else if (ew === 2) propList.push("width-scale"); if (eh === 1) propList.push("height-abs"); else if (eh === 2) propList.push("height-scale"); if (propList.length === 0) return; this._Pin(objectClass, "properties", propList) }, PinByImagePoint(objectClass, imgPt, ea, ew, eh, ez) { const propList = ["imagepoint"]; if (ea) propList.push("angle"); if (ez) propList.push("z"); if (ew === 1) propList.push("width-abs"); else if (ew === 2) propList.push("width-scale"); if (eh === 1) propList.push("height-abs"); else if (eh === 2) propList.push("height-scale"); this._pinImagePoint = imgPt; this._Pin(objectClass, "properties", propList) }, SetPinDistance(d) { if (this._mode === "rope" || this._mode === "bar") this._pinDist = Math.max(d, 0) }, SetDestroy(d) { this._destroy = d }, Unpin() { this._SetPinInst(null); this._mode = ""; this._propSet.clear(); this._pinImagePoint = "" }, Pin(objectClass, mode) { switch (mode) { case 0: this._Pin(objectClass, "properties", ["x", "y", "angle"]); break; case 1: this._Pin(objectClass, "properties", ["x", "y"]); break; case 2: this._Pin(objectClass, "properties", ["angle"]); break; case 3: this._Pin(objectClass, "rope"); break; case 4: this._Pin(objectClass, "bar"); break } } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Pin.Exps = { PinnedUID() { return this._pinInst ? this._pinInst.GetUID() : -1 } } } ;"use strict"; { C3.Behaviors.aekiro_button = class aekiro_buttonBehavior extends C3.SDKBehaviorBase { constructor(a) { super(a); const b = this._runtime.Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0))) } Release() { this._disposables.Release(), this._disposables = null, super.Release(); } _OnPointerDown(a) { this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerMove(a) { this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerUp(a) { this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } async _OnInputDown(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_button); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputDown) await beh.OnAnyInputDown(x, y, source); } } _OnInputMove(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_button); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputMove) beh.OnAnyInputMove(x, y, source); } } async _OnInputUp(a, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_button); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputUp) await beh.OnAnyInputUp(x, y); } } } ; } "use strict"; { C3.Behaviors.aekiro_button.Type = class aekiro_buttonType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_button.Instance = class aekiro_buttonInstance extends Aekiro.button { constructor(behInst, properties) { super(behInst, properties); this.isEnabled = properties[0]; this.frame_normal = properties[1]; this.frame_hover = properties[2]; this.frame_clicked = properties[3]; this.frame_disabled = properties[4]; this.frame_focus = properties[5]; this.clickSound = properties[6]; this.hoverSound = properties[7]; this.focusSound = properties[8]; this.clickAnimation = properties[9]; this.hoverAnimation = properties[10]; this.focusAnimation = properties[11]; this.color_normal = properties[12]; this.color_hover = properties[13]; this.color_clicked = properties[14]; this.color_disabled = properties[15]; this.color_focus = properties[16]; this.clickAnimationFactor = properties[17]; this.hoverAnimationFactor = properties[18]; this.focusAnimationFactor = properties[19]; this.ignoreInput = properties[20]; this.button_constructor(); } OnAnyInputUpC() { this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnClicked); this.proui.Trigger(C3.Plugins.aekiro_proui.Cnds.OnAnyButtonClicked); } OnMouseEnterC() { this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnMouseEnter); } OnMouseLeaveC() { this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnMouseLeave); } OnFocusedC() { this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnFocused); } OnUnFocusedC() { this.Trigger(C3.Behaviors.aekiro_button.Cnds.OnUnFocused); } Release() { super.Release(); } SaveToJson() { return { "isEnabled": this.isEnabled, "frame_normal": this.frame_normal, "frame_hover": this.frame_hover, "frame_clicked": this.frame_clicked, "frame_disabled": this.frame_disabled, "frame_focus": this.frame_focus, "clickSound": this.clickSound, "hoverSound": this.hoverSound, "focusSound": this.focusSound, "clickAnimation": this.clickAnimation, "hoverAnimation": this.hoverAnimation, "focusAnimation": this.focusAnimation, "color_normal": this.color_normal, "color_hover": this.color_hover, "color_clicked": this.color_clicked, "color_disabled": this.color_disabled, "color_focus": this.color_focus, "ignoreInput": this.ignoreInput, "initProps": this.initProps }; } LoadFromJson(o) { this.isEnabled = o["isEnabled"]; this.frame_normal = o["frame_normal"]; this.frame_hover = o["frame_hover"]; this.frame_clicked = o["frame_clicked"]; this.frame_disabled = o["frame_disabled"]; this.frame_focus = o["frame_focus"]; this.clickSound = o["clickSound"]; this.hoverSound = o["hoverSound"]; this.focusSound = o["focusSound"]; this.clickAnimation = o["clickAnimation"]; this.hoverAnimation = o["hoverAnimation"]; this.focusAnimation = o["focusAnimation"]; this.color_normal = o["color_normal"]; this.color_hover = o["color_hover"]; this.color_clicked = o["color_clicked"]; this.color_disabled = o["color_disabled"]; this.color_focus = o["color_focus"]; this.ignoreInput = o["ignoreInput"]; this.initProps = o["initProps"]; this.onInitPropsLoaded(); this.onPropsLoaded(); } } ; } "use strict"; { C3.Behaviors.aekiro_button.Cnds = {}; Object.assign(C3.Behaviors.aekiro_button.Cnds, Aekiro.button.Cnds); } "use strict"; { C3.Behaviors.aekiro_button.Acts = {}; Object.assign(C3.Behaviors.aekiro_button.Acts, Aekiro.button.Acts); } "use strict"; { C3.Behaviors.aekiro_button.Exps = {}; } "use strict"; { C3.Behaviors.aekiro_checkbox = class aekiro_checkboxBehavior extends C3.SDKBehaviorBase { constructor(a) { super(a); const b = this._runtime.Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0))) } Release() { this._disposables.Release(), this._disposables = null, super.Release() } _OnPointerDown(a) { this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerMove(a) { this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerUp(a) { this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } async _OnInputDown(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_checkbox); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputDown) await beh.OnAnyInputDown(x, y, source); } } _OnInputMove(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_checkbox); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputMove) beh.OnAnyInputMove(x, y, source); } } async _OnInputUp(a, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_checkbox); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputUp) await beh.OnAnyInputUp(x, y); } } } ; } "use strict"; { C3.Behaviors.aekiro_checkbox.Type = class aekiro_checkboxType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_checkbox.Instance = class aekiro_checkboxInstance extends Aekiro.checkbox { constructor(behInst, properties) { super(behInst, properties); this.isEnabled = properties[0]; this.value = properties[1]; this.frame_normal = properties[2]; this.frame_hover = properties[3]; this.frame_disabled = properties[4]; this.frame_focus = properties[5]; this.clickSound = properties[6]; this.hoverSound = properties[7]; this.focusSound = properties[8]; this.clickAnimation = properties[9]; this.hoverAnimation = properties[10]; this.focusAnimation = properties[11]; this.color_normal = properties[12]; this.color_hover = properties[13]; this.color_clicked = properties[14]; this.color_disabled = properties[15]; this.color_focus = properties[16]; this.clickAnimationFactor = properties[17]; this.hoverAnimationFactor = properties[18]; this.focusAnimationFactor = properties[19]; this.ignoreInput = properties[20]; this.checkbox_constructor(); } OnAnyInputUpC() { this.setValue(1 - this.value); this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnClicked); } OnMouseEnterC() { this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnMouseEnter); } OnMouseLeaveC() { this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnMouseLeave); } OnFocusedC() { this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnFocused); } OnUnFocusedC() { this.Trigger(C3.Behaviors.aekiro_checkbox.Cnds.OnUnFocused); } Release() { super.Release(); } SaveToJson() { return { "isEnabled": this.isEnabled, "value": this.value, "frame_normal": this.frame_normal, "frame_hover": this.frame_hover, "frame_disabled": this.frame_disabled, "frame_focus": this.frame_focus, "clickSound": this.clickSound, "hoverSound": this.hoverSound, "focusSound": this.focusSound, "clickAnimation": this.clickAnimation, "hoverAnimation": this.hoverAnimation, "focusAnimation": this.focusAnimation, "color_normal": this.color_normal, "color_hover": this.color_hover, "color_clicked": this.color_clicked, "color_disabled": this.color_disabled, "color_focus": this.color_focus, "ignoreInput": this.ignoreInput, "initProps": this.initProps }; } LoadFromJson(o) { this.isEnabled = o["isEnabled"]; this.value = o["value"]; this.frame_normal = o["frame_normal"]; this.frame_hover = o["frame_hover"]; this.frame_disabled = o["frame_disabled"]; this.frame_focus = o["frame_focus"]; this.clickSound = o["clickSound"]; this.hoverSound = o["hoverSound"]; this.focusSound = o["focusSound"]; this.clickAnimation = o["clickAnimation"]; this.hoverAnimation = o["hoverAnimation"]; this.focusAnimation = o["focusAnimation"]; this.color_normal = o["color_normal"]; this.color_hover = o["color_hover"]; this.color_clicked = o["color_clicked"]; this.color_disabled = o["color_disabled"]; this.color_focus = o["color_focus"]; this.ignoreInput = o["ignoreInput"]; this.initProps = o["initProps"]; this.onInitPropsLoaded(); this.onPropsLoaded(); } } ; } "use strict"; { C3.Behaviors.aekiro_checkbox.Cnds = { IsChecked() { return this.value; } }; Object.assign(C3.Behaviors.aekiro_checkbox.Cnds, Aekiro.button.Cnds); } "use strict"; { C3.Behaviors.aekiro_checkbox.Acts = { setValue(value) { this.setValue(value); }, SetIgnoreInput(s) { this.setIgnoreInput(s); }, SetClickSoundVolume(v) { this.audioSources.click.setVolume(v); }, SetHoverSoundVolume(v) { this.audioSources.hover.setVolume(v); } }; Object.assign(C3.Behaviors.aekiro_checkbox.Acts, Aekiro.button.Acts); } "use strict"; { C3.Behaviors.aekiro_checkbox.Exps = { value() { return this.value; } }; } "use strict"; { C3.Behaviors.aekiro_radiobutton = class aekiro_radiobuttonBehavior extends C3.SDKBehaviorBase { constructor(a) { super(a); const b = this._runtime.Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0))); } Release() { this._disposables.Release(), this._disposables = null, super.Release() } _OnPointerDown(a) { this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerMove(a) { this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerUp(a) { this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } async _OnInputDown(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_radiobutton); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputDown) await beh.OnAnyInputDown(x, y, source); } } _OnInputMove(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_radiobutton); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputMove) beh.OnAnyInputMove(x, y, source); } } async _OnInputUp(a, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_radiobutton); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputUp) await beh.OnAnyInputUp(x, y); } } } ; } "use strict"; { C3.Behaviors.aekiro_radiobutton.Type = class aekiro_radiobuttonType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_radiobutton.Instance = class aekiro_radiobuttonInstance extends globalThis.Aekiro.checkbox { constructor(behInst, properties) { super(behInst, properties); this.isEnabled = properties[0]; this.name = properties[1]; this.frame_normal = properties[2]; this.frame_hover = properties[3]; this.frame_disabled = properties[4]; this.frame_focus = properties[5]; this.clickSound = properties[6]; this.hoverSound = properties[7]; this.focusSound = properties[8]; this.clickAnimation = properties[9]; this.hoverAnimation = properties[10]; this.focusAnimation = properties[11]; this.color_normal = properties[12]; this.color_hover = properties[13]; this.color_clicked = properties[14]; this.color_disabled = properties[15]; this.color_focus = properties[16]; this.clickAnimationFactor = properties[17]; this.hoverAnimationFactor = properties[18]; this.focusAnimationFactor = properties[19]; this.ignoreInput = properties[17]; this.GetObjectInstance().GetUnsavedDataMap().aekiro_radiobutton = this; this.checkbox_constructor(); } init() { if (!this.aekiro_gameobject) { return; } this.radioGroup = this.aekiro_gameobject.parent_get(); if (!this.radioGroup) { console.error("ProUI-Radiobutton uid=%s: Radiogroup not found.", this.inst.GetUID()); return; } if (!this.radioGroup.GetUnsavedDataMap().aekiro_radiogroup) { console.error("ProUI-Radiobutton uid=%s: Radiogroup needs to have a Radiogroup behavior.", this.inst.GetUID()); return; } this.radioGroup = this.radioGroup.GetUnsavedDataMap().aekiro_radiogroup; } GetRadioGroup() { var p = this.aekiro_gameobject.parent_get(); if (p) { return p.GetUnsavedDataMap().aekiro_radiogroup; } return null; } setEnabled(isEnabled) { super.setEnabled(isEnabled); var radioGroup = this.GetRadioGroup(); if (isEnabled && radioGroup) { radioGroup.isEnabled = isEnabled; } } OnAnyInputUpC() { var radioGroup = this.GetRadioGroup(); if (radioGroup) { radioGroup.setValue(this.name); } this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnClicked); } OnMouseEnterC() { this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnMouseEnter); } OnMouseLeaveC() { this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnMouseLeave); } OnFocusedC() { this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnFocused); } OnUnFocusedC() { this.Trigger(C3.Behaviors.aekiro_radiobutton.Cnds.OnUnFocused); } Release() { super.Release(); } SaveToJson() { return { "isEnabled": this.isEnabled, "name": this.name, "frame_normal": this.frame_normal, "frame_hover": this.frame_hover, "frame_disabled": this.frame_disabled, "frame_focus": this.frame_focus, "clickSound": this.clickSound, "hoverSound": this.hoverSound, "focusSound": this.focusSound, "clickAnimation": this.clickAnimation, "hoverAnimation": this.hoverAnimation, "focusAnimation": this.focusAnimation, "color_normal": this.color_normal, "color_hover": this.color_hover, "color_clicked": this.color_clicked, "color_disabled": this.color_disabled, "color_focus": this.color_focus, "ignoreInput": this.ignoreInput, "initProps": this.initProps }; } LoadFromJson(o) { this.isEnabled = o["isEnabled"]; this.name = o["name"]; this.frame_normal = o["frame_normal"]; this.frame_hover = o["frame_hover"]; this.frame_disabled = o["frame_disabled"]; this.frame_focus = o["frame_focus"]; this.clickSound = o["clickSound"]; this.hoverSound = o["hoverSound"]; this.focusSound = o["focusSound"]; this.clickAnimation = o["clickAnimation"]; this.hoverAnimation = o["hoverAnimation"]; this.focusAnimation = o["focusAnimation"]; this.color_normal = o["color_normal"]; this.color_hover = o["color_hover"]; this.color_clicked = o["color_clicked"]; this.color_disabled = o["color_disabled"]; this.color_focus = o["color_focus"]; this.ignoreInput = o["ignoreInput"]; this.initProps = o["initProps"]; this.onInitPropsLoaded(); this.onPropsLoaded(); } } ; } "use strict"; { C3.Behaviors.aekiro_radiobutton.Cnds = {}; Object.assign(C3.Behaviors.aekiro_radiobutton.Cnds, globalThis.Aekiro.button.Cnds); } "use strict"; { C3.Behaviors.aekiro_radiobutton.Acts = { SetIgnoreInput(s) { this.setIgnoreInput(s); }, SetClickSoundVolume(v) { this.audioSources.click.setVolume(v); }, SetHoverSoundVolume(v) { this.audioSources.hover.setVolume(v); }, SetName(v) { this.name = v; } }; Object.assign(C3.Behaviors.aekiro_radiobutton.Acts, globalThis.Aekiro.button.Acts); } "use strict"; { C3.Behaviors.aekiro_radiobutton.Exps = { name() { return this.name; } }; } "use strict"; { C3.Behaviors.aekiro_progress = class aekiro_progressBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.aekiro_progress.Type = class aekiro_progressType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { var Tween = globalThis["TWEEN"]; C3.Behaviors.aekiro_progress.Instance = class aekiro_progressInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); if (properties) { this.maxValue = properties[0]; this.value = C3.clamp(properties[1], 0, this.maxValue); this.animation = properties[2]; } this.inst = this.GetObjectInstance(); this.wi = this.GetWorldInfo(); this.goManager = globalThis.aekiro_goManager; this.aekiro_dialogManager = globalThis.aekiro_dialogManager; this.goManager.eventManager.on("childrenRegistred", ()=>this.init(), { "once": true }); } PostCreate() { this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject; if (this.aekiro_gameobject) { this.aekiro_gameobject.eventManager.on("cloned", ()=>this.init(), { "once": true }); } } init() { var wi = this.wi; this.initWidth = wi.GetWidth(); this.transf = { width: wi.GetWidth() }; this.tween = new Tween["Tween"](this.transf); if (this.animation == 1) { this.tween["easing"](Tween["Easing"]["Linear"]["None"]); } else if (this.animation == 2) { this.tween["easing"](Tween["Easing"]["Quadratic"]["Out"]); } this.updateView(); } onInitPropsLoaded() { var wi = this.wi; wi.SetWidth(this.initWidth, true); } isValueValid(value) { if (value == null || isNaN(value) || value === "") { return false; } return true; } setMaxValue(v) { this.maxValue = v; this.value = C3.clamp(this.value, 0, this.maxValue); this.updateView(); } setValue(value) { if (!this.isValueValid(value)) { return false; } value = C3.clamp(value, 0, this.maxValue); if (this.value != value) { this.value = value; this.updateView(); } } updateView() { var targetProp = 0; var progress = this.value / this.maxValue; targetProp = progress * this.initWidth; if (this.animation) { var wi = this.wi; this.transf.width = wi.GetWidth(); this.tween["to"]({ width: targetProp }, 500)["start"](); this._StartTicking(); this.tween["start"](this.GetRuntime().GetWallTime() * 1000); } else { this.wi.SetWidth(targetProp, true); this.wi.SetBboxChanged(); if (this.tween["isPlaying"]) { this.tween["stop"](); this.isTweenPlaying = false; } } } Tick() { if (this.isTweenPlaying) { this.isTweenPlaying = false; } if (this.tween["isPlaying"]) { this.tween["update"](this.GetRuntime().GetWallTime() * 1000); this.isTweenPlaying = true; } if (this.isTweenPlaying) { this.wi.SetWidth(this.transf.width, true); this.wi.SetBboxChanged(); } else { this._StopTicking(); } } Release() { super.Release(); } SaveToJson() { return { "maxValue": this.maxValue, "value": this.value, "animation": this.animation, "initWidth": this.initWidth } } LoadFromJson(o) { this.maxValue = o["maxValue"]; this.value = o["value"]; this.animation = o["animation"]; this.initWidth = o["initWidth"]; this.onInitPropsLoaded(); } } ; } "use strict"; { C3.Behaviors.aekiro_progress.Cnds = {}; } "use strict"; { C3.Behaviors.aekiro_progress.Acts = { setValue(value, animation) { this.animation = animation; this.setValue(value); }, SetMaxValue(v) { this.setMaxValue(v); } }; } "use strict"; { C3.Behaviors.aekiro_progress.Exps = { value() { return this.value; } }; } "use strict"; { C3.Behaviors.mcube_rexspline = class MCRexSpline extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.mcube_rexspline.Type = class MCRexSplineType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.mcube_rexspline.Instance = class MCRexSplineInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._myProperty = 0; if (properties) { this._myProperty = properties[0]; this.enabled = (properties[0] === 1); this.speed = properties[1]; this.setAngle = (properties[2] !== 0); this.isLooping = (properties[3] === 1); this.tension = properties[4]; } if (!this.recycled) { this.points = []; this.curSeg = { ptr: -1, t: 1, p0: null, p1: null, p2: null, p3: null, dist: 0, preX: 0, preY: 0 }; } this.traveledDist = 0; this.movingAngle = 0; this.is_moving = false; this.is_my_call = false; this.lastTick = null; this.LASTU; this.LASTUU; this.LASTUUU; this.wi = this._inst.GetWorldInfo(); this._StartTicking(); } Release() { super.Release(); } SaveToJson() { return {}; } LoadFromJson(o) {} Tick() { if (!this.enabled || !this.is_moving) { return; } else { const dt = this._runtime.GetDt(this._inst); this.move(dt); } } move(dt) { if (dt == null) dt = this._runtime.GetDt(this._inst); if ((dt === 0) || (this.speed == 0)) return; var tickMovingDist = this.speed * dt; var tMD2 = tickMovingDist * tickMovingDist; var sTickMovingDist = tickMovingDist / 20; var segDist = null, t; var x0 = this.wi._x , y0 = this.wi._y; var seg, nx, ny, dist, dist2, i = 0; var preX, preY, preDist2, preSegT; while (1) { seg = this.getSeg(); if (seg == null) break; if (seg.dist === 0) continue; if (segDist !== seg.dist) { segDist = seg.dist t = (sTickMovingDist / segDist); if (t > 0.5) t = 0.5; } seg.t += t; i++; if (seg.t >= 1) { seg.t = 1; nx = seg.p2[0]; ny = seg.p2[1]; } else { nx = this.interpolate(seg, 0, this.tension); ny = this.interpolate(seg, 1, this.tension); } dist2 = this.distance2(x0, y0, nx, ny); if (dist2 >= tMD2) { if (Math.abs(preDist2 - tMD2) < Math.abs(dist2 - tMD2)) { nx = preX; ny = preY; dist2 = preDist2; seg.t = preSegT; } dist = Math.sqrt(dist2); this.traveledDist += dist; this.wi.SetX(nx); this.wi.SetY(ny); break; } else { preX = nx; preY = ny; preDist2 = dist2; preSegT = (seg.t === 1) ? 0 : seg.t; } } if ((x0 === this.wi._x) && (y0 === this.wi._y)) {} else { this.movingAngle = C3.angleTo(x0, y0, this.wi._x, this.wi._y); } if (this.setAngle) { if (this.is_moving) { this.wi.SetAngle(this.movingAngle); } } if (this.speed !== 0) { this.wi.SetBboxChanged(); if (seg == null) { this.onReachLastPoint(); } else { seg.preX = nx; seg.preY = ny; } } } start() { this.curSeg.ptr = -1; this.curSeg.t = 1; this.traveledDist = 0; this.is_moving = true; var seg = this.getSeg(); if (seg === null) this.onReachLastPoint(); } onReachLastPoint() { if (!this.is_moving) return; this.is_moving = false; this.is_my_call = true; this.Trigger(C3.Behaviors.mcube_rexspline.Cnds.OnHitTarget, this.wi); this.is_my_call = false; } hitPoint() { this.is_my_call = true; this.Trigger(C3.Behaviors.mcube_rexspline.Cnds.OnHitAnyPoint, this.wi); this.is_my_call = false; } wrapIndex(idx) { if (this.isLooping) { var cnt = this.points.length; idx = idx % cnt; if (idx < 0) idx = cnt + idx; } return idx; } getSeg() { if (this.curSeg.t === 1) { this.curSeg.ptr = this.wrapIndex(this.curSeg.ptr + 1); var ptr1 = this.curSeg.ptr; var ptr2 = this.wrapIndex(ptr1 + 1); if (ptr2 >= this.points.length) return null; var ptr0 = this.wrapIndex(ptr1 - 1); var ptr3 = this.wrapIndex(ptr2 + 1); this.curSeg.p0 = this.points[ptr0]; this.curSeg.p1 = this.points[ptr1]; this.curSeg.p2 = this.points[ptr2]; this.curSeg.p3 = this.points[ptr3]; this.curSeg.dist = C3.distanceTo(this.curSeg.p1[0], this.curSeg.p1[1], this.curSeg.p2[0], this.curSeg.p2[1]); this.curSeg.t = 0; this.curSeg.preX = this.curSeg.p1[0]; this.curSeg.preY = this.curSeg.p1[1]; this.hitPoint(); } return this.curSeg; } interpolate(seg, i, tension) { var p1 = seg.p1[i]; var p2 = seg.p2[i]; var t = seg.t; var p0 = (seg.p0) ? seg.p0[i] : p1 + (p1 - p2); var p3 = (seg.p3) ? seg.p3[i] : p2 + (p2 - p1); var u, uu, uuu; if (t === this.LASTU) { u = this.LASTU; uu = this.LASTUU; uuu = this.LASTUUU; } else { this.LASTU = u = t; this.LASTUU = uu = u * u; this.LASTUUU = uuu = uu * u; } return (-tension * u + 2 * tension * uu - tension * uuu) * p0 + (+1 + (tension - 3) * uu + (2 - tension) * uuu) * p1 + (+tension * u + (3 - 2 * tension) * uu + (tension - 2) * uuu) * p2 + (-tension * uu + tension * uuu) * p3; } din(d, default_value) { var o; if (d === true) o = 1; else if (d === false) o = 0; else if (d == null) { if (default_value != null) o = default_value; else o = 0; } else if (typeof (d) == "object") o = JSON.stringify(d); else o = d; return o; } distance2(x0, y0, x1, y1) { var dx = (x1 - x0); var dy = (y1 - y0); return dx * dx + dy * dy; } isTickChanged() { var curTick = this._runtime.GetTickCount(); var tickChanged = (this.lastTick != curTick); this.lastTick = curTick; return tickChanged; } getMovingAngle(ret) { if (this.isTickChanged()) { return to_clamped_degrees(this.movingAngle); } } } ; } var clamp_angle_degrees = function(a) { a %= 360; if (a < 0) a += 360; return a; }; var to_degrees = function(x) { return x * (180.0 / Math.PI); }; var to_clamped_degrees = function(x) { return clamp_angle_degrees(to_degrees(x)); }; "use strict"; { C3.Behaviors.mcube_rexspline.Cnds = { OnHitTarget() { return (this.is_my_call); }, OnHitAnyPoint() { return (this.is_my_call); }, IsMoving() { return (this.enabled && this.is_moving); } }; } "use strict"; { C3.Behaviors.mcube_rexspline.Acts = { SetEnabled(en) { this.enabled = (en === 1); }, SetAngleEnabled(en) { this.setAngle = (en === 1); }, AddPoint(x, y) { this.points.push([x, y]); }, ResetPoint(i, x, y) { if (this.is_moving) { var idxp1 = this.curSeg.ptr; var idxp2 = this.curSeg.ptr + 1; if ((idxp1 === i) || (idxp2 === i)) return; } if (i < 0) { this.points.unshift([x, y]); } else if (i < this.points.length) { var p = this.points[i]; p[0] = x; p[1] = y; } else { this.points.push([x, y]); } }, CleanAll() { this.points.length = 0; this.is_moving = false; }, Start() { this.start(); }, Stop() { this.is_moving = false; }, SetSpeed(spd) { this.speed = spd; }, SetLooping(en) { this.isLooping = (en === 1); }, SetTension(tension) { this.tension = tension; } }; } "use strict"; { C3.Behaviors.mcube_rexspline.Exps = { Speed() { return (this.speed); }, Tension() { return (this.tension); }, AngleOfMotion() { if (typeof this.movingAngle != "undefined") { return (this.getMovingAngle()); } else { return 0; } }, Point(idx, part) { var val = this.points; if (idx != null) val = val[idx]; if ((val != null) && (part != null)) { if ((part === 0) || (part === "x") || (part === "X")) val = val[0]; else if ((part === 1) || (part === "y") || (part === "Y")) val = val[1]; } return (din(val)); }, CurSegP0(part) { var val = this.curSeg.ptr; if (part != null) { val = this.points[val]; if (val != null) { if ((part === 0) || (part === "x") || (part === "X")) val = val[0]; else if ((part === 1) || (part === "y") || (part === "Y")) val = val[1]; } else val = 0; } return (val); }, CurSegP1(part) { var val = this.wrapIndex(this.curSeg.ptr + 1); if (part != null) { val = this.points[val]; if (val != null) { if ((part === 0) || (part === "x") || (part === "X")) val = val[0]; else if ((part === 1) || (part === "y") || (part === "Y")) val = val[1]; } else val = 0; } return (val); }, PointsCount() { return (this.points.length); }, TraveledDistance() { return (this.traveledDist); } }; } 'use strict'; { const C3 = self.C3; C3.Behaviors.Timer = class TimerBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Timer.Type = class TimerType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Timer.SingleTimer = class SingleTimer { constructor(current, total, duration, isRegular) { this._current = C3.New(C3.KahanSum); this._current.Set(current || 0); this._total = C3.New(C3.KahanSum); this._total.Set(total || 0); this._duration = duration || 0; this._isRegular = !!isRegular; this._isPaused = false } GetCurrentTime() { return this._current.Get() } GetTotalTime() { return this._total.Get() } GetDuration() { return this._duration } SetPaused(p) { this._isPaused = !!p } IsPaused() { return this._isPaused } Add(t) { this._current.Add(t); this._total.Add(t) } HasFinished() { return this._current.Get() >= this._duration } Update() { if (this.HasFinished()) if (this._isRegular) this._current.Subtract(this._duration); else return true; return false } SaveToJson() { return { "c": this._current.Get(), "t": this._total.Get(), "d": this._duration, "r": this._isRegular, "p": this._isPaused } } LoadFromJson(o) { this._current.Set(o["c"]); this._total.Set(o["t"]); this._duration = o["d"]; this._isRegular = !!o["r"]; this._isPaused = !!o["p"] } } ; C3.Behaviors.Timer.Instance = class TimerInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._timers = new Map } Release() { this._timers.clear(); super.Release() } _UpdateTickState() { if (this._timers.size > 0) { this._StartTicking(); this._StartTicking2() } else { this._StopTicking(); this._StopTicking2() } } SaveToJson() { const ret = {}; for (const [name,timer] of this._timers.entries()) ret[name] = timer.SaveToJson(); return ret } LoadFromJson(o) { this._timers.clear(); for (const [name,data] of Object.entries(o)) { const timer = new C3.Behaviors.Timer.SingleTimer; timer.LoadFromJson(data); this._timers.set(name, timer) } this._UpdateTickState() } Tick() { const dt = this._runtime.GetDt(this._inst); for (const timer of this._timers.values()) if (!timer.IsPaused()) timer.Add(dt) } Tick2() { for (const [name,timer] of this._timers.entries()) { const shouldDelete = timer.Update(); if (shouldDelete) this._timers.delete(name) } } GetDebuggerProperties() { return [{ title: "behaviors.timer.debugger.timers", properties: [...this._timers.entries()].map(entry=>({ name: "$" + entry[0], value: `${Math.round(entry[1].GetCurrentTime() * 10) / 10} / ${Math.round(entry[1].GetDuration() * 10) / 10}` })) }] } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Timer.Cnds = { OnTimer(name) { const timer = this._timers.get(name.toLowerCase()); if (!timer) return false; return timer.HasFinished() }, IsTimerRunning(name) { return this._timers.has(name.toLowerCase()) }, IsTimerPaused(name) { const timer = this._timers.get(name.toLowerCase()); return timer && timer.IsPaused() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Timer.Acts = { StartTimer(duration, type, name) { const timer = new C3.Behaviors.Timer.SingleTimer(0,0,duration,type === 1); this._timers.set(name.toLowerCase(), timer); this._UpdateTickState() }, StopTimer(name) { this._timers.delete(name.toLowerCase()); this._UpdateTickState() }, PauseResumeTimer(name, state) { const timer = this._timers.get(name.toLowerCase()); if (timer) timer.SetPaused(state === 0) } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Timer.Exps = { CurrentTime(name) { const timer = this._timers.get(name.toLowerCase()); if (!timer) return 0; return timer.GetCurrentTime() }, TotalTime(name) { const timer = this._timers.get(name.toLowerCase()); if (!timer) return 0; return timer.GetTotalTime() }, Duration(name) { const timer = this._timers.get(name.toLowerCase()); if (!timer) return 0; return timer.GetDuration() } } } ;"use strict"; { C3.Behaviors.aekiro_radiogroup = class aekiro_radiogroupBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.aekiro_radiogroup.Type = class aekiro_radiogroupType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_radiogroup.Instance = class aekiro_radiogroupInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this.value = properties[0]; this.GetObjectInstance().GetUnsavedDataMap().aekiro_radiogroup = this; this.radioButtons = []; this.isEnabled = true; this.goManager = globalThis.aekiro_goManager; this.goManager.eventManager.on("childrenRegistred", ()=>this.init(), { "once": true }); } PostCreate() { this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject; if (this.aekiro_gameobject) { this.aekiro_gameobject.eventManager.on("cloned", ()=>this.init(), { "once": true }); } } GetRadioButtons() { return this.aekiro_gameobject.children; } init() { if (!this.aekiro_gameobject) { return; } this.radioButtons = this.GetRadioButtons(); var b; var l = this.radioButtons.length; for (var i = 0; i < l; i++) { b = this.radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton; b.init(); } this.updateView(); } isValueValid(value) { var b; var radioButtons = this.GetRadioButtons(); for (var i = 0; i < radioButtons.length; i++) { b = radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton; if (b.name == value) { return true; } } return false; } setValue(value) { if (!this.isValueValid(value)) { return false; } var radioButtons = this.GetRadioButtons(); var b, l = radioButtons.length; for (var i = 0; i < l; i++) { b = radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton; if (b.name == value) { this.value = value; b.setValue(1); } else { b.setValue(0); } } } updateView() { var areAllDisabled = true; var radioButtons = this.GetRadioButtons(); for (var i = 0; i < radioButtons.length; i++) { var b = radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton; if (b.name == this.value) { b.setValue(1); } else { b.setValue(0); } if (b.isEnabled) { areAllDisabled = false; } } if (areAllDisabled) { this.isEnabled = false; } } Release() { super.Release(); } SaveToJson() { return { "value": this.value, }; } LoadFromJson(o) { this.value = o["value"]; } } ; } "use strict"; { C3.Behaviors.aekiro_radiogroup.Cnds = { IsEnabled() { return this.isEnabled; } }; } "use strict"; { C3.Behaviors.aekiro_radiogroup.Acts = { setValue(value) { this.setValue(value); }, setEnabled(isEnabled) { this.isEnabled = isEnabled; for (var i = 0, l = this.radioButtons.length; i < l; i++) { this.radioButtons[i].GetUnsavedDataMap().aekiro_radiobutton.setEnabled(isEnabled); } } }; } "use strict"; { C3.Behaviors.aekiro_radiogroup.Exps = { value() { return this.value; } }; } "use strict"; { C3.Behaviors.aekiro_gridView = class aekiro_gridViewBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.aekiro_gridView.Type = class aekiro_gridViewType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_gridView.Instance = class aekiro_gridViewInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui); if (this.proui) { this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance(); } if (properties) { this.itemName = properties[0]; this.columns = properties[1]; this.rows = properties[2]; this.vspace = properties[3]; this.hspace = properties[4]; this.VPadding = properties[5]; this.HPadding = properties[6]; } this.GetObjectInstance().GetUnsavedDataMap().aekiro_gridview = this; this.inst = this.GetObjectInstance(); this.wi = this.GetWorldInfo(); this.acts = this.GetObjectInstance().GetPlugin().constructor.Acts; this.goManager = globalThis["aekiro_goManager"]; this.template = {}; this.isTemplateSet = false; this.value = []; this.items = []; this.it_column = 0; this.it_row = 0; this.goManager.eventManager.on("childrenRegistred", ()=>{ var children = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject.children; for (var i = 0, l = children.length; i < l; i++) { this.items.push(children[i]); } } , { "once": true }); } PostCreate() { this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject; } setItemTemplate() { if (this.isTemplateSet) { return; } var item = this.goManager.gos[this.itemName]; if (!item) { throw new Error("ProUI-GRIDVIEW: Grid item not found, please check the grid item's name"); return; } this.proui.isTypeValid(this.GetObjectInstance(), [C3.Plugins.Sprite, C3.Plugins.NinePatch, C3.Plugins.TiledBg], "ProUI-GRIDVIEW: Grid item can only be Sprite, 9-patch or tiled backgrounds objects."); var go = item.GetUnsavedDataMap().aekiro_gameobject; this.template = go.getTemplate(); go.destroyHierarchy(); this.isTemplateSet = true; } build() { if (this.rows <= 0 && this.columns <= 0) { console.error("ProUI-GRIDVIEW: max rows and max columns can't be both -1 or 0"); return; } this.setItemTemplate(); var diff = this.value.length - this.items.length; var item, l; if (diff > 0) { l = this.value.length; for (var i = this.items.length; i < l; i++) { item = this.add(i); if (!this.nextRowColumn()) { break; } } } else if (diff < 0) { l = this.items.length; for (var i = this.value.length; i < l; i++) { this.items[i].GetUnsavedDataMap().aekiro_gameobject.destroyHierarchy(); if (!this.previousRowColumn()) { break; } } this.items.splice(this.value.length, -diff); } this.resize(); l = this.value.length; for (var i = 0; i < l; i++) { this.mapData(this.items[i], this.value[i], i); } var self = this; setTimeout(function() { self.Trigger(C3.Behaviors.aekiro_gridView.Cnds.OnRender); }, 0); } add(itemIndex) { var self = this; var item = this.goManager.clone(this.template, null, this.inst, this.wi.GetLayer(), 0, 0); var wi = item.GetWorldInfo(); var offsetX = wi.GetX() - wi.GetBoundingBox().getLeft(); var offsetY = wi.GetY() - wi.GetBoundingBox().getTop(); wi.SetX(this.wi.GetBoundingBox().getLeft() + offsetX + (this.vspace + wi.GetWidth()) * this.it_column + this.HPadding); wi.SetY(this.wi.GetBoundingBox().getTop() + offsetY + (this.hspace + wi.GetHeight()) * this.it_row + this.VPadding); wi.SetBboxChanged(); this.items.push(item); return item; } clear() { this.setItemTemplate(); var items = this.items; for (var i = 0, l = this.items.length; i < l; i++) { items[i].GetUnsavedDataMap().aekiro_gameobject.destroyHierarchy(); } items.length = 0; this.it_column = 0; this.it_row = 0; this.value = []; this.resize(); } resize() { var wi = this.wi; var prevBboxTop = wi.GetBoundingBox().getTop(); var prevBboxLeft = wi.GetBoundingBox().getLeft(); var prevX = wi.GetX(); var prevY = wi.GetY(); if (this.value.length == 0) { wi.SetWidth(5, true); wi.SetHeight(5, true); wi.SetBboxChanged(); wi.SetX(prevBboxLeft + (wi.GetX() - wi.GetBoundingBox().getLeft())); wi.SetY(prevBboxTop + (wi.GetY() - wi.GetBoundingBox().getTop())); wi.SetBboxChanged(); return; } var row = Math.ceil(this.value.length / this.columns); var column = Math.ceil(this.value.length / this.rows); if (this.rows < 0) { column = this.columns; if (this.value.length < this.columns) { column = this.value.length; } } else if (this.columns < 0) { row = this.rows; if (this.value.length < this.rows) { row = this.value.length; } } else { column = this.columns; row = this.rows; } var itemWidth = this.items[0].GetWorldInfo().GetWidth(); var itemHeight = this.items[0].GetWorldInfo().GetHeight(); wi.SetWidth(itemWidth * column + this.vspace * (column - 1) + 2 * this.HPadding, true); wi.SetHeight(itemHeight * row + this.hspace * (row - 1) + 2 * this.VPadding, true); wi.SetBboxChanged(); if (wi.GetX() != prevX || wi.GetX() != prevY) { return; } wi.SetX(prevBboxLeft + (wi.GetX() - wi.GetBoundingBox().getLeft())); wi.SetY(prevBboxTop + (wi.GetY() - wi.GetBoundingBox().getTop())); wi.SetBboxChanged(); } mapData(inst, data, index) { var binder = inst.GetUnsavedDataMap().aekiro_gridviewbind; if (binder && this.isObject(data)) { binder.index = index; binder.setValue(data); binder.gridView = this; binder.triggerOnGridViewRender(); } var children = inst.GetUnsavedDataMap().aekiro_gameobject.children; for (var i = 0, l = children.length; i < l; i++) { this.mapData(children[i], data, index); } } item_setKey(i, key, value) { self["_"]["set"](this.value[i], key, value); } nextRowColumn() { if (this.rows < 0) { this.it_column++; if (this.it_column == this.columns) { this.it_column = 0; this.it_row++; } } else if (this.columns < 0) { this.it_row++; if (this.it_row == this.rows) { this.it_row = 0; this.it_column++; } } else { this.it_column++; if (this.it_column == this.columns) { this.it_column = 0; this.it_row++; } if (this.it_row == this.rows) return false; } return true; } previousRowColumn() { if (this.rows < 0) { this.it_column--; if (this.it_column < 0) { this.it_column = this.columns - 1; this.it_row--; } } else if (this.columns < 0) { this.it_row--; if (this.it_row < 0) { this.it_row = this.rows - 1; this.it_column--; } } else { this.it_column--; if (this.it_column < 0) { this.it_column = this.columns - 1; this.it_row--; } if (this.it_row == 0) return false; } return true; } isObject(a) { return (!!a) && (a.constructor === Object); } isArray(a) { return (!!a) && (a.constructor === Array); } Release() { super.Release(); } SaveToJson() { return { "itemName": this.itemName, "columns": this.columns, "rows": this.rows, "vspace": this.vspace, "hspace": this.hspace, "VPadding": this.VPadding, "HPadding": this.HPadding, "template": this.template, "isTemplateSet": this.isTemplateSet, "value": this.value, "it_column": this.it_column, "it_row": this.it_row }; } LoadFromJson(o) { this.itemName = o["itemName"]; this.columns = o["columns"]; this.rows = o["rows"]; this.vspace = o["vspace"]; this.hspace = o["hspace"]; this.VPadding = o["VPadding"]; this.HPadding = o["HPadding"]; this.template = o["template"]; this.isTemplateSet = o["isTemplateSet"]; this.value = o["value"]; this.it_column = o["it_column"]; this.it_row = o["it_row"]; } } ; } "use strict"; { C3.Behaviors.aekiro_gridView.Cnds = { OnRender() { return true; } }; } "use strict"; { C3.Behaviors.aekiro_gridView.Acts = { SetDataByJsonString(data) { try { data = JSON.parse(data); } catch (e) { console.error("ProUI-GRIDVIEW: json parse error !"); return; } if (!this.isArray(data)) { console.error("ProUI-GRIDVIEW: json is not an array !"); return; } this.value = data; this.build(); }, SetDataByJsonObject(jsonObject, root) { var data = jsonObject.GetFirstPicked().GetSdkInstance()._data; if (root) { data = data[root]; } if (data && !this.isArray(data)) { console.error("ProUI-GRIDVIEW: json is not an array !"); return; } this.value = data; this.build(); }, Clear() { this.clear(); } }; } "use strict"; { C3.Behaviors.aekiro_gridView.Acts = { SetDataByJsonString(data) { try { data = JSON.parse(data); } catch (e) { console.error("ProUI-GRIDVIEW: json parse error !"); return; } if (!this.isArray(data)) { console.error("ProUI-GRIDVIEW: json is not an array !"); return; } this.value = data; this.build(); }, SetDataByJsonObject(jsonObject) { var data = jsonObject.GetFirstPicked().GetSdkInstance()._data; if (!this.isArray(data)) { console.error("ProUI-GRIDVIEW: json is not an array !"); return; } this.value = data; this.build(); }, Clear() { this.clear(); } }; } "use strict"; { C3.Behaviors.aekiro_scrollView = class aekiro_scrollViewBehavior extends C3.SDKBehaviorBase { constructor(a) { super(a); const b = this._runtime.Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(b, "pointerdown", (a)=>this._OnPointerDown(a.data)),C3.Disposable.From(b, "pointermove", (a)=>this._OnPointerMove(a.data)),C3.Disposable.From(b, "pointerup", (a)=>this._OnPointerUp(a.data, !1)),C3.Disposable.From(b, "pointercancel", (a)=>this._OnPointerUp(a.data, !0))), C3.Disposable.From(b, "wheel", (a)=>this._OnMouseWheel(a.data)) } Release() { this._disposables.Release(), this._disposables = null, super.Release() } _OnPointerDown(a) { this._OnInputDown(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerMove(a) { this._OnInputMove(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnPointerUp(a) { this._OnInputUp(a["pointerId"].toString(), a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } _OnMouseWheel(a) { this._OnMouseWheel2(a["deltaY"], a["clientX"] - this._runtime.GetCanvasClientX(), a["clientY"] - this._runtime.GetCanvasClientY()) } async _OnInputDown(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputDown) await beh.OnAnyInputDown(x, y, source); } } _OnInputMove(source, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputMove) beh.OnAnyInputMove(x, y, source); } } async _OnInputUp(a, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnAnyInputUp) await beh.OnAnyInputUp(x, y); } } _OnMouseWheel2(a, b, c) { const insts = this.GetInstances(); for (const inst of insts) { const beh = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.aekiro_scrollView); const wi = inst.GetWorldInfo() , layer = wi.GetLayer() , [x,y] = layer.CanvasCssToLayer(b, c, wi.GetTotalZElevation()); if (beh.OnMouseWheel) beh.OnMouseWheel(x, y, a); } } } ; } "use strict"; { C3.Behaviors.aekiro_scrollView.Type = class aekiro_scrollView2Type extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_scrollView.Instance = class aekiro_scrollViewInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui); if (this.proui) { this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance(); } this._SetVisible = this.GetObjectInstance().GetPlugin().constructor.Acts.SetVisible; this.runtime = this.GetRuntime(); this.aekiro_scrollViewManager = globalThis.aekiro_scrollViewManager; this.aekiro_scrollViewManager.add(this.GetObjectInstance()); this.aekiro_dialogManager = globalThis.aekiro_dialogManager; this.goManager = globalThis.aekiro_goManager; this.GetObjectInstance().GetUnsavedDataMap().aekiro_scrollView = this; this.inst = this.GetObjectInstance(); this.wi = this.GetWorldInfo(); if (properties) { this.isEnabled = properties[0]; this.direction = properties[1]; this.isSwipeScrollEnabled = properties[2]; this.isMouseScroll = properties[3]; this.inertia = properties[4]; this.movement = properties[5]; this.contentUID = properties[6]; this.vSliderUID = properties[7]; this.vScrollBarUID = properties[8]; this.hSliderUID = properties[9]; this.hScrollBarUID = properties[10]; } if (!this.inertia) { this.movement = 0; } this.elasticF = 1; if (this.movement) { this.elasticF = 0.4; } this.onTouchStarted = false; this.isTouchMoving = false; this.onSliderTouchStarted = false; this.onvSliderTouchStarted = false; this.onhSliderTouchStarted = false; this.content = null; this.vSlider = null; this.vScrollBar = null; this.hSlider = null; this.hScrollBar = null; this.isInit = false; this.isContentScrollableV = true; this.isContentScrollableH = true; this.scroll = { isIdle: true, offsetX: 0, offestY: 0, scrollRatio: 0, decelerationVelocityX: 0, decelerationVelocityY: 0, scrollToTargetY: null, scrollToTargetX: null, scrollToX: false, scrollToY: false, scrollToSmooth: 0.3 }; this.goManager.eventManager.on("childrenRegistred", ()=>{ this.init(); } , { "once": true }); this.SetForceOwnTextureListener = this.goManager.eventManager.on("childrenRegistred", ()=>{ this.wi.GetLayer().SetForceOwnTexture(true); } ); } init() { if (this.isInit) { return; } this.isVScrollEnabled = (this.direction == 0) || (this.direction == 2); this.isHScrollEnabled = (this.direction == 1) || (this.direction == 2); this.prevSelfLayerVisible = this.wi.GetLayer().IsVisible(); try { this.vSlider = this.getPart(this.vSliderUID, "vertical slider"); this.vScrollBar = this.getPart(this.vScrollBarUID, "vertical scrollbar"); this.hSlider = this.getPart(this.hSliderUID, "horizontal slider"); this.hScrollBar = this.getPart(this.hScrollBarUID, "horizontal scrollbar"); this.content = this.getPart(this.contentUID, "content", true); var contentWi = this.content.GetWorldInfo(); this.contentWi = this.content.GetWorldInfo(); } catch (e) { console.error(e) this.isEnabled = false; return; } this.content.GetUnsavedDataMap().aekiro_scrollView = this; this.contentWi.SetHeight_old2 = this.contentWi.SetHeight; this.contentWi.SetHeight = function(v, onlyNode) { this.SetHeight_old2(v, onlyNode); this.GetInstance().GetUnsavedDataMap().aekiro_scrollView.OnSizeChanged(); } ; this.contentWi.SetWidth_old2 = this.contentWi.SetWidth; this.contentWi.SetWidth = function(v, onlyNode) { this.SetWidth_old2(v, onlyNode); this.GetInstance().GetUnsavedDataMap().aekiro_scrollView.OnSizeChanged(); } ; this.content.GetUnsavedDataMap().aekiro_gameobject.eventManager.on("childrenAdded", function(inst) { if (inst) { inst.GetUnsavedDataMap().aekiro_gameobject.applyActionToHierarchy(inst.GetUnsavedDataMap().aekiro_gameobject.acts.SetEffect, 9); } }); if (contentWi.GetHeight(true) <= this.wi.GetHeight(true)) { this.isContentScrollableV = false; } if (contentWi.GetWidth(true) <= this.wi.GetWidth(true)) { this.isContentScrollableH = false; } contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (contentWi.GetX() - contentWi.GetBoundingBox().getLeft())); contentWi.SetY(this.wi.GetBoundingBox().getTop() + (contentWi.GetY() - contentWi.GetBoundingBox().getTop())); contentWi.SetBboxChanged(); this.wi.GetLayer().SetForceOwnTexture(true); this.GetRuntime().UpdateRender(); this.content.GetUnsavedDataMap().aekiro_gameobject.applyActionToHierarchy(this.content.GetUnsavedDataMap().aekiro_gameobject.acts.SetEffect, 9); if (this.hSlider && this.hScrollBar) { this.hSliderWi = this.hSlider.GetWorldInfo(); this.hScrollBarWi = this.hScrollBar.GetWorldInfo(); var x = this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()); this.hSliderWi.SetX(x); this.hSliderWi.SetBboxChanged(); this.hScrollBar.GetSdkInstance().CallAction(this.hScrollBar.GetPlugin().constructor.Acts.MoveToTop); this.hSlider.GetSdkInstance().CallAction(this.hSlider.GetPlugin().constructor.Acts.MoveToTop); } if (this.vSlider && this.vScrollBar) { this.vSliderWi = this.vSlider.GetWorldInfo(); this.vScrollBarWi = this.vScrollBar.GetWorldInfo(); var y = this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()); this.vSliderWi.SetY(y); this.vSliderWi.SetBboxChanged(); this.vScrollBar.GetSdkInstance().CallAction(this.vScrollBar.GetPlugin().constructor.Acts.MoveToTop); this.vSlider.GetSdkInstance().CallAction(this.vSlider.GetPlugin().constructor.Acts.MoveToTop); } this.isInit = true; this._StartTicking(); } getPart(name, errorLabel, isRequired) { if (!name && !isRequired) return; var invalidName = false; var p = this.goManager.gos[name]; if (p) { if (!this.proui.isTypeValid(p, [C3.Plugins.Sprite, C3.Plugins.NinePatch, C3.Plugins.TiledBg])) { throw new Error("ProUI-ScrollView-UID = " + this.GetObjectInstance().GetUID() + " : The " + errorLabel + " of the scrollView can only be a Sprite, TiledBackground Or 9-patch object."); } return p; } else { invalidName = true; } if (!name && isRequired) { invalidName = true; } if (invalidName) { throw new Error("ProUI-ScrollView: " + errorLabel + " not found, please check its name"); } return; } PostCreate() { this.sdkInstance_callAction = this.GetObjectInstance().GetSdkInstance().CallAction; this.sdkInstance_acts = this.GetObjectInstance().GetPlugin().constructor.Acts; } OnMouseWheel(x, y, deltaY) { if (this.isEnabled && this.isVScrollEnabled && this.isContentScrollableV && this.isMouseScroll && this.isInteractible(x, y) && this.wi.ContainsPoint(x, y)) { this.scroll.scrollToX = false; this.scroll.scrollToY = false; this.scroll.isIdle = false; this._StartTicking(); this.onWheelStarted = true; var dir = (deltaY > 0 ? -1 : 1); if (this.inertia) { this.scroll.decelerationVelocityY = dir * 650; } else { this.contentWi.OffsetY(30 * dir); } this.scroll.decelerationVelocityX = 0; } } isInteractible(x, y) { if (this.proui.ignoreInput) { return false; } var isUnder = false; if (this.aekiro_dialogManager) { isUnder = this.aekiro_dialogManager.isInstanceUnder(this.wi.GetLayer().GetIndex()); } var isOverlaped = this.aekiro_scrollViewManager.isOverlaped(this.GetObjectInstance(), x, y); return !isUnder && !isOverlaped; } OnAnyInputDown(x, y) { if (!this.isEnabled || !this.isInteractible(x, y)) { return; } if (this.wi.ContainsPoint(x, y)) { this.OnInputDown(x, y); } if (this.vSlider && this.vScrollBar && this.isVScrollEnabled && this.isContentScrollableV && this.vSliderWi.ContainsPoint(x, y)) { this.OnSliderTouchStart("v", x, y); } if (this.hSlider && this.hScrollBar && this.isHScrollEnabled && this.isContentScrollableH && this.hSliderWi.ContainsPoint(x, y)) { this.OnSliderTouchStart("h", x, y); } } OnInputDown(x, y) { if (!this.isEnabled || !this.isSwipeScrollEnabled) { return; } this.onTouchStarted = true; this.scroll.startTime = Date.now(); if (this.isVScrollEnabled && this.isContentScrollableV) { this.scroll.offsetY = y - this.contentWi.GetY(); this.scroll.touchStartY = y; this.scroll.isIdle = false; this._StartTicking(); this.scroll.scrollToX = false; this.scroll.scrollToY = false; } if (this.isHScrollEnabled && this.isContentScrollableH) { this.scroll.offsetX = x - this.contentWi.GetX(); this.scroll.touchStartX = x; this.scroll.isIdle = false; this._StartTicking(); this.scroll.scrollToX = false; this.scroll.scrollToY = false; } this.touchX = x; this.touchY = y; this.scroll.decelerationVelocityX = 0; this.scroll.decelerationVelocityY = 0; } OnSliderTouchStart(type, x, y) { if (type == "v") { this.scroll.offsetY = y - this.vSliderWi.GetY(); this.onvSliderTouchStarted = true; } else { this.scroll.offsetX = x - this.hSliderWi.GetX(); this.onhSliderTouchStarted = true; } this.onSliderTouchStarted = true; this.scroll.isIdle = true; this._StopTicking(); this.boundContent(); this.scroll.scrollToX = false; this.scroll.scrollToY = false; this.scroll.decelerationVelocityX = 0; this.scroll.decelerationVelocityY = 0; } OnAnyInputUp(x, y) { if (!this.isEnabled) { return; } if (this.onTouchStarted) { this.OnInputUp(x, y); } this.onTouchStarted = false; this.onSliderTouchStarted = false; this.onvSliderTouchStarted = false; this.onhSliderTouchStarted = false; } OnInputUp(x, y) { this.scroll.elapsedTime = (Date.now() - this.scroll.startTime) / 1000; if (this.isSwipeScrollEnabled && this.inertia) { if (this.isHScrollEnabled && this.isContentScrollableH) { this.scroll.decelerationVelocityX = (x - this.scroll.touchStartX) / this.scroll.elapsedTime; if (Math.abs(this.scroll.decelerationVelocityX) < 100) { this.scroll.decelerationVelocityX = 0; } } if (this.isVScrollEnabled && this.isContentScrollableV) { this.scroll.decelerationVelocityY = (y - this.scroll.touchStartY) / this.scroll.elapsedTime; if (Math.abs(this.scroll.decelerationVelocityY) < 100) { this.scroll.decelerationVelocityY = 0; } } } this.isTouchMoving = false; } OnAnyInputMove(x, y, source) { if (this.onTouchStarted) { this.isTouchMoving = true; this.touchX = x; this.touchY = y; } if (this.onvSliderTouchStarted && this.isVScrollEnabled && this.isContentScrollableV) { var newy = y - this.scroll.offsetY; this.vSliderWi.SetY(C3.clamp(newy, this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()), this.vScrollBarWi.GetBoundingBox().getBottom() - (this.vSliderWi.GetBoundingBox().getBottom() - this.vSliderWi.GetY()))); this.vSliderWi.SetBboxChanged(); this.contentWi.SetY(this.wi.GetBoundingBox().getTop() + (this.contentWi.GetY() - this.contentWi.GetBoundingBox().getTop()) - ((this.vSliderWi.GetBoundingBox().getTop() - this.vScrollBarWi.GetBoundingBox().getTop()) / (this.vScrollBarWi.GetHeight(true) - this.vSliderWi.GetHeight(true))) * (this.contentWi.GetHeight(true) - this.wi.GetHeight(true))); this.contentWi.SetBboxChanged(); } if (this.onhSliderTouchStarted && this.isHScrollEnabled && this.isContentScrollableH) { var newx = x - this.scroll.offsetX; this.hSliderWi.SetX(C3.clamp(newx, this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()), this.hScrollBarWi.GetBoundingBox().getRight() - (this.hSliderWi.GetBoundingBox().getRight() - this.hSliderWi.GetX()))); this.hSliderWi.SetBboxChanged(); this.contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (this.contentWi.GetX() - this.contentWi.GetBoundingBox().getLeft()) - ((this.hSliderWi.GetBoundingBox().getLeft() - this.hScrollBarWi.GetBoundingBox().getLeft()) / (this.hScrollBarWi.GetWidth(true) - this.hSliderWi.GetWidth(true))) * (this.contentWi.GetWidth(true) - this.wi.GetWidth(true))); this.contentWi.SetBboxChanged(); } } boundContent() { if (this.contentWi.GetHeight(true) <= this.wi.GetHeight(true)) { this.contentWi.SetY(this.wi.GetBoundingBox().getTop() + (this.contentWi.GetY() - this.contentWi.GetBoundingBox().getTop())); } else { var diff_topY = this.contentWi.GetBoundingBox().getTop() - this.wi.GetBoundingBox().getTop(); var diff_bottomY = this.wi.GetBoundingBox().getBottom() - this.contentWi.GetBoundingBox().getBottom(); if (diff_topY > 0 || diff_bottomY > 0) { this.contentWi.SetY(C3.clamp(this.contentWi.GetY(), this.contentWi.GetY() + diff_bottomY, this.contentWi.GetY() - diff_topY)); } } if (this.contentWi.GetWidth(true) <= this.wi.GetWidth(true)) { this.contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (this.contentWi.GetX() - this.contentWi.GetBoundingBox().getLeft())); } else { var diff_rightX = this.wi.GetBoundingBox().getRight() - this.contentWi.GetBoundingBox().getRight(); var diff_leftX = this.contentWi.GetBoundingBox().getLeft() - this.wi.GetBoundingBox().getLeft(); if (diff_rightX > 0 || diff_leftX > 0) { this.contentWi.SetX(C3.clamp(this.contentWi.GetX(), this.contentWi.GetX() + diff_rightX, this.contentWi.GetX() - diff_leftX)); } } this.contentWi.SetBboxChanged(); } boundContentX(elasticF) { if (this.isHScrollEnabled) { var isOutOfBound; this.contentWi.SetBboxChanged(); if (this.contentWi.GetWidth(true) <= this.wi.GetWidth(true)) { this.contentWi.SetX(this.wi.GetBoundingBox().getLeft() + (this.contentWi.GetX() - this.contentWi.GetBoundingBox().getLeft())); isOutOfBound = true; } else { var diff_rightX = this.wi.GetBoundingBox().getRight() - this.contentWi.GetBoundingBox().getRight(); var diff_leftX = this.contentWi.GetBoundingBox().getLeft() - this.wi.GetBoundingBox().getLeft(); isOutOfBound = diff_rightX > 0 || diff_leftX > 0; if (isOutOfBound) { if (elasticF && this.elasticF != 1) { this.contentWi.SetX(C3.clamp(this.contentWi.GetX(), C3.lerp(this.contentWi.GetX(), this.contentWi.GetX() + diff_rightX, this.elasticF), C3.lerp(this.contentWi.GetX(), this.contentWi.GetX() - diff_leftX, this.elasticF))); } else { this.contentWi.SetX(C3.clamp(this.contentWi.GetX(), this.contentWi.GetX() + diff_rightX, this.contentWi.GetX() - diff_leftX)); } } } this.contentWi.SetBboxChanged(); return isOutOfBound; } } boundContentY(elasticF) { if (this.isVScrollEnabled) { var isOutOfBound; this.contentWi.SetBboxChanged(); if (this.contentWi.GetHeight(true) <= this.wi.GetHeight(true)) { this.contentWi.SetY(this.wi.GetBoundingBox().getTop() + (this.contentWi.GetY() - this.contentWi.GetBoundingBox().getTop())); isOutOfBound = true; } else { var diff_topY = this.contentWi.GetBoundingBox().getTop() - this.wi.GetBoundingBox().getTop(); var diff_bottomY = this.wi.GetBoundingBox().getBottom() - this.contentWi.GetBoundingBox().getBottom(); isOutOfBound = diff_topY > 0 || diff_bottomY > 0; if (isOutOfBound) { if (elasticF && this.elasticF != 1) { this.contentWi.SetY(C3.clamp(this.contentWi.GetY(), C3.lerp(this.contentWi.GetY(), this.contentWi.GetY() + diff_bottomY, this.elasticF), C3.lerp(this.contentWi.GetY(), this.contentWi.GetY() - diff_topY, this.elasticF))); } else { this.contentWi.SetY(C3.clamp(this.contentWi.GetY(), this.contentWi.GetY() + diff_bottomY, this.contentWi.GetY() - diff_topY)); } } } this.contentWi.SetBboxChanged(); return isOutOfBound; } } scrollTo(targetX, targetY, targetType, smooth) { if (!this.isEnabled) return; this.scroll.scrollToSmooth = smooth; this.scroll.scrollToTargetY = null; this.scroll.scrollToTargetX = null; this.scroll.scrollToX = false; this.scroll.scrollToY = false; this.onScrollToStarted = false; if (this.isVScrollEnabled && this.isContentScrollableV) { var viewportCenterY = (this.wi.GetBoundingBox().getTop() + this.wi.GetBoundingBox().getBottom()) / 2; if (targetType) { targetY = C3.clamp(targetY, 0, 1); targetY = this.contentWi.GetBoundingBox().getTop() + targetY * this.contentWi.GetHeight(true); } this.scroll.scrollToTargetY = this.contentWi.GetY() + (viewportCenterY - targetY); this.scroll.scrollToY = true; this.scroll.isIdle = false; this._StartTicking(); this.onScrollToStarted = true; } if (this.isHScrollEnabled && this.isContentScrollableH) { var viewportCenterX = (this.wi.GetBoundingBox().getLeft() + this.wi.GetBoundingBox().getRight()) / 2; if (targetType) { targetX = C3.clamp(targetX, 0, 1); targetX = this.contentWi.GetBoundingBox().getLeft() + targetX * this.contentWi.GetWidth(true); } this.scroll.scrollToTargetX = this.contentWi.GetX() + (viewportCenterX - targetX); this.scroll.scrollToX = true; this.scroll.isIdle = false; this._StartTicking(); this.onScrollToStarted = true; } this.contentWi.SetBboxChanged(); } scrollBy(distanceX, distanceY, targetType, smooth) { if (!this.isEnabled) return; this.scroll.scrollToSmooth = smooth; this.scroll.scrollToTargetY = null; this.scroll.scrollToTargetX = null; this.scroll.scrollToX = false; this.scroll.scrollToY = false; this.onScrollToStarted = false; this.boundContent(); if (this.isVScrollEnabled && this.isContentScrollableV) { if (targetType) { distanceY = C3.clamp(distanceY, -1, 1); distanceY = distanceY * this.contentWi.GetHeight(true); } this.scroll.scrollToTargetY = this.contentWi.GetY() - distanceY; this.scroll.scrollToY = true; this.scroll.isIdle = false; this._StartTicking(); this.onScrollToStarted = true; } if (this.isHScrollEnabled && this.isContentScrollableH) { if (targetType) { distanceX = C3.clamp(distanceX, -1, 1); distanceX = distanceX * this.contentWi.GetWidth(true); } this.scroll.scrollToTargetX = this.contentWi.GetX() - distanceX; this.scroll.scrollToX = true; this.scroll.isIdle = false; this._StartTicking(); this.onScrollToStarted = true; } this.contentWi.SetBboxChanged(); } boundSlider(slider) { if (slider == "v" && this.vSlider && this.vScrollBar) { var sy = this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()) + (this.vScrollBarWi.GetHeight(true) - this.vSliderWi.GetHeight(true)) * ((this.contentWi.GetBoundingBox().getTop() - this.wi.GetBoundingBox().getTop()) / (this.wi.GetHeight(true) - this.contentWi.GetHeight(true))); sy = C3.clamp(sy, this.vScrollBarWi.GetBoundingBox().getTop() + (this.vSliderWi.GetY() - this.vSliderWi.GetBoundingBox().getTop()), this.vScrollBarWi.GetBoundingBox().getBottom() - (this.vSliderWi.GetBoundingBox().getBottom() - this.vSliderWi.GetY())); this.vSliderWi.SetY(sy); this.vSliderWi.SetBboxChanged(); } if (slider == "h" && this.hSlider && this.hScrollBar) { var sx = this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()) + (this.hScrollBarWi.GetWidth(true) - this.hSliderWi.GetWidth(true)) * ((this.contentWi.GetBoundingBox().getLeft() - this.wi.GetBoundingBox().getLeft()) / (this.wi.GetWidth(true) - this.contentWi.GetWidth(true))); sx = C3.clamp(sx, this.hScrollBarWi.GetBoundingBox().getLeft() + (this.hSliderWi.GetX() - this.hSliderWi.GetBoundingBox().getLeft()), this.hScrollBarWi.GetBoundingBox().getRight() - (this.hSliderWi.GetBoundingBox().getRight() - this.hSliderWi.GetX())); this.hSliderWi.SetX(sx); this.hSliderWi.SetBboxChanged(); } } postGridviewUpdate() { var parts = [this.vScrollBar, this.vSlider, this.hScrollBar, this.hSlider]; for (var i = 0, l = parts.length; i < l; i++) { if (parts[i]) { parts[i].GetSdkInstance().CallAction(parts[i].GetPlugin().constructor.Acts.MoveToTop); } } } OnSizeChanged() { this.contentWi.SetBboxChanged(); this.boundContent(); this.boundSlider("v"); this.boundSlider("h"); this.isContentScrollableV = true; this.isContentScrollableH = true; if (this.contentWi.GetHeight(true) <= this.wi.GetHeight(true)) { this.isContentScrollableV = false; } if (this.contentWi.GetWidth(true) <= this.wi.GetWidth(true)) { this.isContentScrollableH = false; } } isMoving() { return this.isTouchMoving; } Tick() { if (this.scroll.isIdle || !this.content || !this.isEnabled) { this._StopTicking(); } if (this.onTouchStarted && this.isSwipeScrollEnabled && !this.onSliderTouchStarted) { if (this.isHScrollEnabled && this.isContentScrollableH) { this.contentWi.SetX(this.touchX - this.scroll.offsetX); } if (this.isVScrollEnabled && this.isContentScrollableV) { this.contentWi.SetY(this.touchY - this.scroll.offsetY); } this.contentWi.SetBboxChanged(); } if (this.inertia) { if (this.isHScrollEnabled && Math.abs(this.scroll.decelerationVelocityX) > 1) { this.contentWi.OffsetX(this.scroll.decelerationVelocityX * this.runtime.GetDt(this.content)); this.scroll.decelerationVelocityX *= 0.95; this.contentWi.SetBboxChanged(); } if (this.isVScrollEnabled && Math.abs(this.scroll.decelerationVelocityY) > 1) { this.contentWi.OffsetY(this.scroll.decelerationVelocityY * this.runtime.GetDt(this.content)); this.scroll.decelerationVelocityY *= 0.95; this.contentWi.SetBboxChanged(); } } if (this.scroll.scrollToY && this.scroll.scrollToTargetY != null && this.isVScrollEnabled && this.isContentScrollableV && !this.onSliderTouchStarted) { this.contentWi.SetY(C3.lerp(this.contentWi.GetY(), this.scroll.scrollToTargetY, this.scroll.scrollToSmooth)); if (this.boundContentY()) { this.scroll.scrollToY = false; this.boundContentY(); } else if (Math.abs(this.contentWi.GetY() - this.scroll.scrollToTargetY) < 1) { this.contentWi.SetY(this.scroll.scrollToTargetY); this.contentWi.SetBboxChanged(); this.scroll.scrollToY = false; } } if (this.scroll.scrollToX && this.scroll.scrollToTargetX != null && this.isHScrollEnabled && this.isContentScrollableH && !this.onSliderTouchStarted) { this.contentWi.SetX(C3.lerp(this.contentWi.GetX(), this.scroll.scrollToTargetX, this.scroll.scrollToSmooth)); if (this.boundContentX()) { this.scroll.scrollToX = false; this.boundContentX(); } else if (Math.abs(this.contentWi.GetX() - this.scroll.scrollToTargetX) < 1) { this.contentWi.SetX(this.scroll.scrollToTargetX); this.contentWi.SetBboxChanged(); this.scroll.scrollToX = false; } } if (this.onScrollToStarted && !this.scroll.scrollToX && !this.scroll.scrollToY) { this.scroll.isIdle = true; this.onScrollToStarted = false; } if (this.isVScrollEnabled && this.isContentScrollableV) { this.boundSlider("v"); } if (this.isHScrollEnabled && this.isContentScrollableH) { this.boundSlider("h"); } if (this.isVScrollEnabled && !this.scroll.scrollToY) { this.boundContentY(true); } if (this.isHScrollEnabled && !this.scroll.scrollToX) { this.boundContentX(true); } if (!this.onTouchStarted && Math.abs(this.scroll.decelerationVelocityX) <= 1 && Math.abs(this.scroll.decelerationVelocityY) <= 1 && !this.scroll.scrollToX && !this.scroll.scrollToY) { this.scroll.isIdle = true; this.boundContent(); } } Release() { this.aekiro_scrollViewManager.remove(this.GetObjectInstance()); this.goManager.eventManager.removeListener(this.SetForceOwnTextureListener); super.Release(); } SaveToJson() { return { "isEnabled": this.isEnabled, "direction": this.direction, "isSwipeScrollEnabled": this.isSwipeScrollEnabled, "isMouseScroll": this.isMouseScroll, "inertia": this.inertia, "movement": this.movement, "contentUID": this.contentUID, "vSliderUID": this.vSliderUID, "vScrollBarUID": this.vScrollBarUID, "hSliderUID": this.hSliderUID, "hScrollBarUID": this.hScrollBarUID }; } LoadFromJson(o) { this.isEnabled = o["isEnabled"]; this.direction = o["direction"]; this.isSwipeScrollEnabled = o["isSwipeScrollEnabled"]; this.isMouseScroll = o["isMouseScroll"]; this.inertia = o["inertia"]; this.movement = o["movement"]; this.contentUID = o["contentUID"]; this.vSliderUID = o["vSliderUID"]; this.vScrollBarUID = o["vScrollBarUID"]; this.hSliderUID = o["hSliderUID"]; this.hScrollBarUID = o["hScrollBarUID"]; } } ; } "use strict"; { C3.Behaviors.aekiro_scrollView.Cnds = {}; } "use strict"; { C3.Behaviors.aekiro_scrollView.Acts = { ScrollTo(targetX, targetY, targetType, smooth) { this.scrollTo(targetX, targetY, targetType, smooth); }, ScrollBy(distanceX, distanceY, targetType, smooth) { this.scrollBy(distanceX, distanceY, targetType, smooth); }, setEnabled(isEnabled) { this.isEnabled = isEnabled; } }; } "use strict"; { C3.Behaviors.aekiro_scrollView.Exps = {}; } 'use strict'; { const C3 = self.C3; C3.Behaviors.DragnDrop = class DragnDropBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); const rt = this._runtime.Dispatcher(); this._disposables = new C3.CompositeDisposable(C3.Disposable.From(rt, "pointerdown", e=>this._OnPointerDown(e.data)),C3.Disposable.From(rt, "pointermove", e=>this._OnPointerMove(e.data)),C3.Disposable.From(rt, "pointerup", e=>this._OnPointerUp(e.data, false)),C3.Disposable.From(rt, "pointercancel", e=>this._OnPointerUp(e.data, true))) } Release() { this._disposables.Release(); this._disposables = null; super.Release() } _OnPointerDown(e) { this._OnInputDown(e["pointerId"].toString(), e["pageX"] - this._runtime.GetCanvasClientX(), e["pageY"] - this._runtime.GetCanvasClientY()) } _OnPointerMove(e) { this._OnInputMove(e["pointerId"].toString(), e["pageX"] - this._runtime.GetCanvasClientX(), e["pageY"] - this._runtime.GetCanvasClientY()) } _OnPointerUp(e, isCancel) { this._OnInputUp(e["pointerId"].toString()) } async _OnInputDown(src, clientX, clientY) { const myInstances = this.GetInstances(); let topMost = null; let topBehInst = null; let topX = 0; let topY = 0; for (const inst of myInstances) { const behInst = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.DragnDrop); if (!behInst.IsEnabled() || behInst.IsDragging()) continue; const wi = inst.GetWorldInfo(); const layer = wi.GetLayer(); const [lx,ly] = layer.CanvasCssToLayer(clientX, clientY, wi.GetTotalZElevation()); if (!wi.ContainsPoint(lx, ly)) continue; if (!topMost) { topMost = inst; topBehInst = behInst; topX = lx; topY = ly; continue } const topWi = topMost.GetWorldInfo(); if (layer.GetIndex() > topWi.GetLayer().GetIndex() || layer.GetIndex() === topWi.GetLayer().GetIndex() && wi.GetZIndex() > topWi.GetZIndex()) { topMost = inst; topBehInst = behInst; topX = lx; topY = ly } } if (topMost) await topBehInst._OnDown(src, topX, topY) } _OnInputMove(src, clientX, clientY) { const myInstances = this.GetInstances(); for (const inst of myInstances) { const behInst = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.DragnDrop); if (!behInst.IsEnabled() || !behInst.IsDragging() || behInst.IsDragging() && behInst.GetDragSource() !== src) continue; const wi = inst.GetWorldInfo(); const layer = wi.GetLayer(); const [lx,ly] = layer.CanvasCssToLayer(clientX, clientY, wi.GetTotalZElevation()); behInst._OnMove(lx, ly) } } async _OnInputUp(src) { const myInstances = this.GetInstances(); for (const inst of myInstances) { const behInst = inst.GetBehaviorSdkInstanceFromCtor(C3.Behaviors.DragnDrop); if (behInst.IsDragging() && behInst.GetDragSource() === src) await behInst._OnUp() } } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.DragnDrop.Type = class DragnDropType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; const AXES = 0; const ENABLE = 1; C3.Behaviors.DragnDrop.Instance = class DragnDropInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._isDragging = false; this._dx = 0; this._dy = 0; this._dragSource = ""; this._axes = 0; this._isEnabled = true; if (properties) { this._axes = properties[AXES]; this._isEnabled = properties[ENABLE] } } Release() { super.Release() } SaveToJson() { return { "a": this._axes, "e": this._isEnabled } } LoadFromJson(o) { this._axes = o["a"]; this._isEnabled = o["e"]; this._isDragging = false } IsEnabled() { return this._isEnabled } IsDragging() { return this._isDragging } GetDragSource() { return this._dragSource } async _OnDown(src, x, y) { const wi = this.GetWorldInfo(); this._dx = x - wi.GetX(); this._dy = y - wi.GetY(); this._isDragging = true; this._dragSource = src; await this.TriggerAsync(C3.Behaviors.DragnDrop.Cnds.OnDragStart) } _OnMove(x, y) { const wi = this.GetWorldInfo(); const newX = x - this._dx; const newY = y - this._dy; if (this._axes === 0) { if (wi.GetX() !== newX || wi.GetY() !== newY) { wi.SetXY(newX, newY); wi.SetBboxChanged() } } else if (this._axes === 1) { if (wi.GetX() !== newX) { wi.SetX(newX); wi.SetBboxChanged() } } else if (this._axes === 2) if (wi.GetY() !== newY) { wi.SetY(newY); wi.SetBboxChanged() } } async _OnUp() { this._isDragging = false; await this.TriggerAsync(C3.Behaviors.DragnDrop.Cnds.OnDrop) } GetPropertyValueByIndex(index) { switch (index) { case AXES: return this._axes; case ENABLE: return this._isEnabled } } SetPropertyValueByIndex(index, value) { switch (index) { case AXES: this._axes = value; break; case ENABLE: this._isEnabled = !!value; break } } GetDebuggerProperties() { const prefix = "behaviors.dragndrop"; return [{ title: "$" + this.GetBehaviorType().GetName(), properties: [{ name: prefix + ".debugger.is-dragging", value: this._isDragging }, { name: prefix + ".properties.enabled.name", value: this._isEnabled, onedit: v=>this._isEnabled = v }] }] } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.DragnDrop.Cnds = { IsDragging() { return this._isDragging }, OnDragStart() { return true }, OnDrop() { return true }, IsEnabled() { return this._isEnabled } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.DragnDrop.Acts = { SetEnabled(e) { this._isEnabled = !!e; if (!this._isEnabled) this._isDragging = false }, SetAxes(a) { this._axes = a }, Drop() { if (this._isDragging) this._OnUp() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.DragnDrop.Exps = {} } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Flash = class FlashBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts) } Release() { super.Release() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Flash.Type = class FlashType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType) } Release() { super.Release() } OnCreate() {} } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Flash.Instance = class FlashInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); this._onTime = 0; this._offTime = 0; this._stage = 0; this._stageTimeLeft = 0; this._timeLeft = 0; this._StartTicking() } Release() { super.Release() } SaveToJson() { return { "on": this._onTime, "off": this._offTime, "s": this._stage, "stl": this._stageTimeLeft, "tl": this._timeLeft } } LoadFromJson(o) { this._onTime = o["on"]; this._offTime = o["off"]; this._stage = o["s"]; this._stageTimeLeft = o["stl"]; this._timeLeft = o["tl"] === null ? Infinity : o["tl"] } Tick() { if (this._timeLeft <= 0) return; const dt = this._runtime.GetDt(this._inst); this._timeLeft -= dt; if (this._timeLeft <= 0) { this._timeLeft = 0; this._inst.GetWorldInfo().SetVisible(true); this._runtime.UpdateRender(); return this.DebugTrigger(C3.Behaviors.Flash.Cnds.OnFlashEnded) } this._stageTimeLeft -= dt; if (this._stageTimeLeft <= 0) { if (this._stage === 0) { this._inst.GetWorldInfo().SetVisible(false); this._stage = 1; this._stageTimeLeft += this._offTime } else { this._inst.GetWorldInfo().SetVisible(true); this._stage = 0; this._stageTimeLeft += this._onTime } this._runtime.UpdateRender() } } GetDebuggerProperties() { const prefix = "behaviors.flash.debugger"; return [{ title: "$" + this.GetBehaviorType().GetName(), properties: [{ name: prefix + ".on-time", value: this._onTime, onedit: v=>this._onTime = v }, { name: prefix + ".off-time", value: this._offTime, onedit: v=>this._offTime = v }, { name: prefix + ".is-flashing", value: this._timeLeft > 0 }, { name: prefix + ".time-left", value: this._timeLeft }] }] } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Flash.Cnds = { IsFlashing() { return this._timeLeft > 0 }, OnFlashEnded() { return true } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Flash.Acts = { Flash(on, off, dur) { this._onTime = on; this._offTime = off; this._stage = 1; this._stageTimeLeft = off; this._timeLeft = dur; this._inst.GetWorldInfo().SetVisible(false); this._runtime.UpdateRender() }, StopFlashing() { this._timeLeft = 0; this._inst.GetWorldInfo().SetVisible(true); this._runtime.UpdateRender() } } } ;'use strict'; { const C3 = self.C3; C3.Behaviors.Flash.Exps = {} } ;"use strict"; { C3.Behaviors.aekiro_dialog = class aekiro_dialogBehavior extends C3.SDKBehaviorBase { constructor(opts) { super(opts); } Release() { super.Release(); } } ; } "use strict"; { C3.Behaviors.aekiro_dialog.Type = class aekiro_dialogType extends C3.SDKBehaviorTypeBase { constructor(behaviorType) { super(behaviorType); } Release() { super.Release(); } OnCreate() {} } ; } "use strict"; { C3.Behaviors.aekiro_dialog.Instance = class aekiro_dialogInstance extends C3.SDKBehaviorInstanceBase { constructor(behInst, properties) { super(behInst); if (properties) { this.openAnimation = properties[0]; this.openAnimTweenFunction = properties[1]; this.openAnimDuration = properties[2]; this.openSound = properties[3]; this.closeAnimation = properties[4]; this.closeAnimTweenFunction = properties[5]; this.closeAnimDuration = properties[6]; this.closeSound = properties[7]; this.closeButtonUID = properties[8]; this.isModal = properties[9]; } this.proui = this.GetRuntime().GetSingleGlobalObjectClassByCtor(C3.Plugins.aekiro_proui); if (this.proui) { this.proui = this.proui.GetSingleGlobalInstance().GetSdkInstance(); } this.GetObjectInstance().GetUnsavedDataMap().aekiro_dialog = this; this.wi = this.GetWorldInfo(); this.inst = this.GetObjectInstance(); this.aekiro_dialogManager = globalThis["aekiro_dialogManager"]; this.goManager = globalThis["aekiro_goManager"]; this.isInit = false; this.isOpen = false; this.tween = new self["TWEEN"]["Tween"](); this.tween_opacity = new self["TWEEN"]["Tween"](); this.tweenObject = {}; this.reverseTweenObject = {}; this.tweenFunctions = [self["TWEEN"]["Easing"]["Linear"]["None"], self["TWEEN"]["Easing"]["Quadratic"]["Out"], self["TWEEN"]["Easing"]["Quartic"]["Out"], self["TWEEN"]["Easing"]["Exponential"]["Out"], self["TWEEN"]["Easing"]["Circular"]["Out"], self["TWEEN"]["Easing"]["Back"]["Out"], self["TWEEN"]["Easing"]["Elastic"]["Out"], self["TWEEN"]["Easing"]["Bounce"]["Out"]]; this.goManager.eventManager.on("childrenRegistred", ()=>{ this.setCloseButton(); this.onCreateInit(); } , { "once": true }); } PostCreate() { this.aekiro_gameobject = this.GetObjectInstance().GetUnsavedDataMap().aekiro_gameobject; } onCreateInit() { var map = this.GetObjectInstance().GetUnsavedDataMap(); if (!map.audioSources) { map.audioSources = {}; } this.audioSources = map.audioSources; this.audioSources.open = new AudioSource(this.openSound,this.GetRuntime()); this.audioSources.close = new AudioSource(this.closeSound,this.GetRuntime()); this.setVisible(false); this.wi.SetX(this.wi.GetLayer().GetViewport().getLeft()); this.wi.SetBboxChanged(); this.isInit = true; } setCloseButton() { if (!this.closeButtonUID) return; this.closeButton = this.goManager.gos[this.closeButtonUID]; if (!this.closeButton) { console.error("ProUI-Dialog: Close button not found; Please check its name !"); return; } if (!this.closeButton.GetUnsavedDataMap().aekiro_button) { console.error("ProUI-Dialog: The close button needs to have a button behavior !"); return; } var self = this; this.closeButton.GetUnsavedDataMap().aekiro_button.callbacks.push(function() { self.close(); }); } SetOwnScale(scale) { var layers = this.getOutLayers(); layers.push(this.wi.GetLayer()); for (var i = 0, l = layers.length; i < l; i++) { layers[i].SetOwnScale(scale); } } SetOpacity(opacity) { var layers = this.getOutLayers(); layers.push(this.wi.GetLayer()); for (var i = 0, l = layers.length; i < l; i++) { layers[i].SetOpacity(opacity); } } setVisible(isVisible) { var layers = this.getOutLayers(); layers.push(this.wi.GetLayer()); for (var i = 0, l = layers.length; i < l; i++) { layers[i].SetVisible(isVisible); } } getOutLayers() { var mylayer = this.wi.GetLayer(); var insts = this.aekiro_gameobject.hierarchyToArray(); var layers = []; var layer; for (var i = 0, l = insts.length; i < l; i++) { layer = insts[i].GetWorldInfo().GetLayer(); if (layer != mylayer && layers.indexOf(layer) == -1) { layers.push(layer); } } return layers; } setInitialState(targetX, targetY, center) { var initX, initY; var viewport = this.wi.GetLayer().GetViewport(); if (this.openAnimation == 0 || this.openAnimation == 5 || this.openAnimation == 6) { initX = targetX; initY = targetY; if (center) { initY = (viewport.getTop() + viewport.getBottom()) / 2; initX = (viewport.getLeft() + viewport.getRight()) / 2; } if (this.openAnimation == 5 || this.openAnimation == 6) { if (this.openAnimation == 5) { this.wi.GetLayer().SetOwnScale(2); } else { this.wi.GetLayer().SetOwnScale(0.2); } this.wi.GetLayer().SetOpacity(0); } } else if (this.openAnimation == 1) { initY = viewport.getTop() - this.wi.GetHeight() / 2 - 100; if (center) { initX = (viewport.getLeft() + viewport.getRight()) / 2; } else { initX = targetX; } } else if (this.openAnimation == 2) { initY = viewport.getBottom() + this.wi.GetHeight() / 2 + 100; if (center) { initX = (viewport.getLeft() + viewport.getRight()) / 2; } else { initX = targetX; } } else if (this.openAnimation == 3) { initX = viewport.getRight() + this.wi.GetWidth() / 2 + 100; if (center) { initY = (viewport.getTop() + viewport.getBottom()) / 2; } else { initY = targetY; } } else if (this.openAnimation == 4) { initX = viewport.getLeft() - this.wi.GetWidth() / 2 - 100; if (center) { initY = (viewport.getTop() + viewport.getBottom()) / 2; } else { initY = targetY; } } this.wi.SetX(initX); this.wi.SetY(initY); this.wi.SetBboxChanged(); } open(_targetX, _targetY, center) { if (this.isOpen) { return; } if (this.aekiro_dialogManager.isModalDialogOpened()) { console.log("ProUI-Dialog: Can not open dialog because modal dialog is already opened"); return; } if (!this.isOpen && this.tween["isPlaying"]) { this.tween["stop"](); } this.postClose(); this.aekiro_dialogManager.addDialog(this.GetObjectInstance()); this.isOpen = true; this.Trigger(C3.Behaviors.aekiro_dialog.Cnds.onDialogOpened); if (this.GetRuntime().GetTimeScale() != 1) { this.aekiro_gameobject.setTimeScale(1); } this.setInitialState(_targetX, _targetY, center); this.setVisible(true); var targetX = _targetX; var targetY = _targetY; var viewport = this.wi.GetLayer().GetViewport(); if (center) { targetX = (viewport.getLeft() + viewport.getRight()) / 2; targetY = (viewport.getTop() + viewport.getBottom()) / 2; } if (this.openAnimDuration == 0) { this.openAnimation = 0; } this.isScaleAnimation = false; this.tweenObject.x = this.wi.GetX(); this.tweenObject.y = this.wi.GetY(); this.tweenObject.scale = this.wi.GetLayer().GetOwnScale(); this.tweenObject.opacity = this.wi.GetLayer().GetOpacity(); this.tween["setObject"](this.tweenObject); this.tween["easing"](this.tweenFunctions[this.openAnimTweenFunction]); this.tween["onComplete"](this.postOpen, this); if (this.openAnimation == 1 || this.openAnimation == 2) { this.tween["to"]({ y: targetY }, this.openAnimDuration); this.reverseTweenObject.y = this.wi.GetY(); } else if (this.openAnimation == 3 || this.openAnimation == 4) { this.tween["to"]({ x: targetX }, this.openAnimDuration); this.reverseTweenObject.x = this.wi.GetX(); } else if (this.openAnimation == 5 || this.openAnimation == 6) { this.tween["to"]({ scale: 1 }, this.openAnimDuration); this.reverseTweenObject.scale = this.wi.GetLayer().GetOwnScale(); this.tween_opacity["setObject"](this.tweenObject); this.tween_opacity["to"]({ opacity: 1 }, 300); this.tween_opacity["easing"](self["TWEEN"]["Easing"]["Quartic"]["Out"]); this.isScaleAnimation = true; this.outLayers = this.getOutLayers(); } if (this.openAnimation > 0) { this.tween["start"](this.GetRuntime().GetWallTime() * 1000); this._StartTicking(); if (this.openAnimation == 5 || this.openAnimation == 6) { this.tween_opacity["start"](this.GetRuntime().GetWallTime() * 1000); } } else { this.wi.SetXY(targetX, targetY); this.wi.SetBboxChanged(); } this.audioSources.open.play(); } postOpen() {} getCloseTargetPosition() { var viewport = this.wi.GetLayer().GetViewport(); var X = this.wi.GetX(); var Y = this.wi.GetY(); if (this.closeAnimation == 2) { Y = viewport.getBottom() + this.wi.GetHeight() / 2 + 100; } else if (this.closeAnimation == 3) { Y = viewport.getTop() - this.wi.GetHeight() / 2 - 100; } else if (this.closeAnimation == 4) { X = viewport.getLeft() - this.wi.GetWidth() / 2 - 100; } else if (this.closeAnimation == 5) { X = viewport.getRight() + this.wi.GetWidth() / 2 + 100; } return { x: X, y: Y }; } close() { if (!this.isOpen || this.tween["isPlaying"]) { return; } this.isOpen = false; this.aekiro_dialogManager.removeDialog(this.GetObjectInstance()); this.Trigger(C3.Behaviors.aekiro_dialog.Cnds.onDialogClosed); var target = this.getCloseTargetPosition(); var targetX = target.x; var targetY = target.y; if (this.closeAnimDuration == 0) { this.closeAnimation = 0; } this.isScaleAnimation = false; this.tweenObject.x = this.wi.GetX(); this.tweenObject.y = this.wi.GetY(); this.tweenObject.scale = this.wi.GetLayer().GetOwnScale(); this.tweenObject.opacity = this.wi.GetLayer().GetOpacity(); this.tween["setObject"](this.tweenObject); this.tween["easing"](this.tweenFunctions[this.closeAnimTweenFunction]); this.tween["onComplete"](this.postClose, this); if (this.closeAnimation == 2 || this.closeAnimation == 3) { this.tween["to"]({ y: targetY }, this.closeAnimDuration); } else if (this.closeAnimation == 4 || this.closeAnimation == 5) { this.tween["to"]({ x: targetX }, this.closeAnimDuration); } else if (this.closeAnimation == 6 || this.closeAnimation == 7) { if (this.closeAnimation == 6) { this.tween["to"]({ scale: 0.2 }, this.closeAnimDuration); } else { this.tween["to"]({ scale: 2 }, this.closeAnimDuration); } this.tween_opacity["setObject"](this.tweenObject); this.tween_opacity["to"]({ opacity: 0 }, 300); this.tween_opacity["easing"](self["TWEEN"]["Easing"]["Quartic"]["Out"]); this.isScaleAnimation = true; this.outLayers = this.getOutLayers(); } else if (this.closeAnimation == 1) { this.tween["to"](this.reverseTweenObject, this.openAnimDuration); if (this.openAnimation == 5 || this.openAnimation == 6) { this.isScaleAnimation = true; this.tween_opacity["to"]({ opacity: 0 }, 300); } } if (this.closeAnimation == 0 || (this.openAnimation == 0 && this.closeAnimation == 1)) { this.postClose(); } else if (this.closeAnimation == 1) { if (this.openAnimation == 5 || this.openAnimation == 6) { this.tween_opacity["start"](this.GetRuntime().GetWallTime() * 1000); } this.tween["start"](this.GetRuntime().GetWallTime() * 1000); this._StartTicking(); } else { this.tween["start"](this.GetRuntime().GetWallTime() * 1000); if (this.closeAnimation == 6 || this.closeAnimation == 7) { this.tween_opacity["start"](this.GetRuntime().GetWallTime() * 1000); } this._StartTicking(); } this.audioSources.close.play(); } postClose() { var layer = this.wi.GetLayer(); var viewport = layer.GetViewport(); this.SetOwnScale(1); this.SetOpacity(1); this.setVisible(false); var x = (viewport.getLeft() + viewport.getRight()) / 2; var y = viewport.getTop() - this.wi.GetHeight() / 2 - 100; this.wi.SetX(x); this.wi.SetY(y); this.wi.SetBboxChanged(); this._StopTicking(); } Tick() { var layer; if (this.tween["isPlaying"]) { this.tween["update"](this.GetRuntime().GetWallTime() * 1000); if (this.isScaleAnimation) { layer = this.wi.GetLayer(); layer.SetOwnScale(this.tweenObject.scale); for (var i = 0, l = this.outLayers.length; i < l; i++) { this.outLayers[i].SetOwnScale(this.tweenObject.scale); } } else { this.wi.SetXY(this.tweenObject.x, this.tweenObject.y); this.wi.SetBboxChanged(); } } if (this.tween_opacity["isPlaying"]) { this.tween_opacity["update"](this.GetRuntime().GetWallTime() * 1000); layer.SetOpacity(this.tweenObject.opacity); for (var i = 0, l = this.outLayers.length; i < l; i++) { this.outLayers[i].SetOpacity(this.tweenObject.opacity); } } if (!this.tween["isPlaying"]) { this._StopTicking(); } } Release() { this.aekiro_dialogManager.removeDialog(this.GetObjectInstance()); super.Release(); } SaveToJson() { return { "openAnimation": this.openAnimation, "openAnimTweenFunction": this.openAnimTweenFunction, "openAnimDuration": this.openAnimDuration, "openSound": this.openSound, "closeAnimation": this.closeAnimation, "closeAnimTweenFunction": this.closeAnimTweenFunction, "closeAnimDuration": this.closeAnimDuration, "closeSound": this.closeSound, "closeButtonUID": this.closeButtonUID, "isModal": this.isModal }; } LoadFromJson(o) { this.openAnimation = o["openAnimation"]; this.openAnimTweenFunction = o["openAnimTweenFunction"]; this.openAnimDuration = o["openAnimDuration"]; this.openSound = o["openSound"]; this.closeAnimation = o["closeAnimation"]; this.closeAnimTweenFunction = o["closeAnimTweenFunction"]; this.closeAnimDuration = o["closeAnimDuration"]; this.closeSound = o["closeSound"]; this.closeButtonUID = o["closeButtonUID"]; this.isModal = o["isModal"]; } } } "use strict"; { C3.Behaviors.aekiro_dialog.Cnds = { onDialogOpened() { return true; }, onDialogClosed() { return true; }, isOpened() { return this.isOpen; } }; } "use strict"; { C3.Behaviors.aekiro_dialog.Acts = { Open(targetX, targetY, isCentered) { this.open(targetX, targetY, isCentered); }, Close() { this.close(); }, SetOpenSoundVolume(v) { this.audioSources.open.setVolume(v); }, SetCloseSoundVolume(v) { this.audioSources.close.setVolume(v); } }; } "use strict"; { C3.Behaviors.aekiro_dialog.Exps = {}; } "use strict" { const C3 = self.C3; self.C3_GetObjectRefTable = function() { return [C3.Plugins.Spritefont2, C3.Behaviors.aekiro_gameobject, C3.Behaviors.MoveTo, C3.Behaviors.Fade, C3.Behaviors.aekiro_gridviewbind, C3.Behaviors.Pin, C3.Plugins.Sprite, C3.Behaviors.aekiro_button, C3.Behaviors.aekiro_checkbox, C3.Behaviors.aekiro_radiobutton, C3.Plugins.NinePatch, C3.Plugins.Arr, C3.Plugins.AJAX, C3.Plugins.Json, C3.Plugins.aekiro_proui, C3.Behaviors.aekiro_progress, C3.Behaviors.mcube_rexspline, C3.Behaviors.Timer, C3.Plugins.Touch, C3.Plugins.Mouse, C3.Plugins.Keyboard, C3.Plugins.Browser, C3.Behaviors.aekiro_radiogroup, C3.Behaviors.aekiro_gridView, C3.Behaviors.aekiro_scrollView, C3.Plugins.TiledBg, C3.Behaviors.DragnDrop, C3.Plugins.DrawingCanvas, C3.Behaviors.Flash, C3.Plugins.Audio, C3.Plugins.LocalStorage, C3.Plugins.CBhash, C3.Behaviors.aekiro_dialog, C3.Plugins.Sparsha_copyclip, C3.Plugins.Massive_Cube_Forge, C3.Plugins.TextBox, C3.Plugins.System.Cnds.OnLayoutStart, C3.Plugins.System.Acts.SetTimescale, C3.Plugins.aekiro_proui.Acts.Init, C3.Plugins.Spritefont2.Acts.SetText, C3.Plugins.Audio.Acts.StopAll, C3.ScriptsInEvents.Egame_Event1_Act5, C3.Plugins.Arr.Acts.SetX, C3.Plugins.Json.Acts.Parse, C3.Behaviors.aekiro_gridView.Acts.Clear, C3.Plugins.AJAX.Acts.RequestFile, C3.Plugins.System.Acts.MapFunction, C3.Plugins.System.Acts.SetLayerVisible, C3.Plugins.System.Acts.SetVar, C3.Plugins.Sprite.Acts.Destroy, C3.Plugins.DrawingCanvas.Acts.ClearCanvas, C3.Plugins.System.Exps.rgba, C3.Plugins.DrawingCanvas.Acts.PasteObject, C3.Plugins.Spritefont2.Acts.Destroy, C3.Plugins.System.Cnds.Compare, C3.Plugins.Audio.Acts.Play, C3.Plugins.System.Cnds.Else, C3.Plugins.System.Cnds.For, C3.Plugins.System.Exps.loopindex, C3.Plugins.System.Acts.CreateObject, C3.Plugins.System.Exps.int, C3.Plugins.System.Exps.tokenat, C3.Plugins.Sprite.Exps.Width, C3.Plugins.Sprite.Acts.SetInstanceVar, C3.Plugins.Sprite.Acts.SetAnimFrame, C3.Plugins.Sprite.Acts.MoveToTop, C3.Plugins.Spritefont2.Acts.MoveToTop, C3.Plugins.Sprite.Acts.AddChild, C3.Plugins.Sprite.Acts.SetPos, C3.Plugins.Arr.Exps.At, C3.Plugins.System.Cnds.IsGroupActive, C3.Plugins.System.Exps.random, C3.Plugins.System.Exps.tokencount, C3.Plugins.Json.Exps.Get, C3.Plugins.System.Acts.CreateObjectByName, C3.ScriptsInEvents.Egame_Event16_Act9, C3.Plugins.Sprite.Acts.SetOpacity, C3.Behaviors.aekiro_progress.Acts.SetMaxValue, C3.Behaviors.aekiro_progress.Acts.setValue, C3.Plugins.Sprite.Cnds.OnAnimFinished, C3.Plugins.Sprite.Acts.SetAnim, C3.Behaviors.mcube_rexspline.Cnds.OnHitTarget, C3.Behaviors.Timer.Cnds.OnTimer, C3.Plugins.Sprite.Cnds.OnDestroyed, C3.Plugins.Sprite.Acts.Spawn, C3.Behaviors.MoveTo.Acts.MoveToPosition, C3.Plugins.Spritefont2.Exps.X, C3.Plugins.Spritefont2.Exps.Y, C3.Plugins.System.Acts.AddVar, C3.Plugins.Sprite.Cnds.OnAnyAnimFinished, C3.Plugins.Touch.Cnds.OnTouchObject, C3.Plugins.Sprite.Cnds.IsBoolInstanceVarSet, C3.Plugins.System.Cnds.LayerVisible, C3.Plugins.Sprite.Acts.SetPosToObject, C3.Plugins.Sprite.Acts.StartAnim, C3.Plugins.Audio.Acts.PlayByName, C3.Plugins.System.Exps.choose, C3.Plugins.Mouse.Cnds.IsOverObject, C3.Plugins.Touch.Cnds.OnTapGestureObject, C3.Behaviors.aekiro_radiobutton.Cnds.OnClicked, C3.Behaviors.aekiro_gameobject.Cnds.IsName, C3.Plugins.Json.Exps.ArraySize, C3.Plugins.System.Cnds.PickAll, C3.Plugins.Sprite.Acts.SetEffectParam, C3.ScriptsInEvents.Egame_Event65_Act1, C3.Plugins.System.Acts.SetFunctionReturnValue, C3.Plugins.System.Exps.len, C3.ScriptsInEvents.Egame_Event67_Act3, C3.Plugins.System.Cnds.Repeat, C3.Plugins.System.Exps.left, C3.Plugins.System.Exps.right, C3.Plugins.Arr.Cnds.CompareXY, C3.Plugins.Arr.Acts.SetXY, C3.Plugins.Sprite.Cnds.PickByUID, C3.Plugins.Spritefont2.Acts.AppendText, C3.Plugins.NinePatch.Acts.SetSize, C3.Plugins.Spritefont2.Exps.TextWidth, C3.Plugins.Spritefont2.Exps.TextHeight, C3.Plugins.NinePatch.Acts.SetPosToObject, C3.Plugins.NinePatch.Acts.SetY, C3.Plugins.NinePatch.Exps.Y, C3.Plugins.NinePatch.Exps.Height, C3.Plugins.System.Exps.viewportheight, C3.Plugins.Spritefont2.Acts.SetPos, C3.Plugins.NinePatch.Exps.X, C3.Plugins.Sprite.Exps.AnimationFrame, C3.Plugins.NinePatch.Acts.MoveToTop, C3.Plugins.System.Cnds.CompareBoolVar, C3.Behaviors.Timer.Acts.StopTimer, C3.Behaviors.Timer.Acts.StartTimer, C3.Plugins.Spritefont2.Acts.SetY, C3.Plugins.Json.Acts.PushValue, C3.Plugins.Json.Acts.SetJSON, C3.Plugins.Json.Exps.GetAsCompactString, C3.Behaviors.aekiro_gridView.Acts.SetDataByJsonObject, C3.Plugins.System.Cnds.ForEach, C3.Plugins.NinePatch.Cnds.CompareInstanceVar, C3.Behaviors.aekiro_gameobject.Cnds.IsParentName, C3.Behaviors.aekiro_gameobject.Exps.parent, C3.Plugins.Sprite.Acts.SetVisible, C3.Plugins.Sprite.Cnds.IsVisible, C3.Plugins.Sprite.Cnds.CompareInstanceVar, C3.Plugins.Sprite.Acts.SetDefaultColor, C3.Behaviors.aekiro_button.Acts.setNormalColor, C3.Plugins.System.Exps.rgbex255, C3.ScriptsInEvents.Egame_Event193_Act1, C3.Plugins.Spritefont2.Acts.SetX, C3.Plugins.Sprite.Acts.SetX, C3.Plugins.Sprite.Exps.LayerName, C3.Behaviors.mcube_rexspline.Acts.AddPoint, C3.Behaviors.mcube_rexspline.Acts.Start, C3.Plugins.Arr.Cnds.ArrForEach, C3.Plugins.Arr.Cnds.CompareCurrent, C3.Plugins.Arr.Exps.CurX, C3.Plugins.System.Acts.WaitForPreviousActions, C3.Plugins.Json.Cnds.ForEach, C3.Plugins.Arr.Cnds.CompareX, C3.Plugins.Json.Exps.CurrentKey, C3.Behaviors.aekiro_gridviewbind.Cnds.OnGridViewRender, C3.Behaviors.aekiro_gridviewbind.Exps.get, C3.Behaviors.aekiro_button.Cnds.OnMouseEnter, C3.Plugins.Sprite.Exps.UID, C3.Behaviors.aekiro_button.Cnds.OnMouseLeave, C3.Plugins.Sprite.Acts.SubInstanceVar, C3.Plugins.Sprite.Acts.SetBoolInstanceVar, C3.Plugins.System.Cnds.CompareVar, C3.Plugins.Sprite.Exps.X, C3.Plugins.Sprite.Exps.Y, C3.Plugins.LocalStorage.Acts.SetItem, C3.Plugins.Massive_Cube_Forge.Exps.encodeb64, C3.Plugins.Arr.Exps.AsJSON, C3.Plugins.Sprite.Cnds.PickInstVarHiLow, C3.Behaviors.Pin.Acts.PinByProperties, C3.Plugins.Arr.Exps.Width, C3.Plugins.System.Acts.CallMappedFunction, C3.Behaviors.aekiro_button.Cnds.OnClicked, C3.Plugins.Sprite.Acts.SetY, C3.Plugins.Sprite.Acts.AddInstanceVar, C3.Plugins.NinePatch.Exps.Width, C3.Behaviors.aekiro_scrollView.Acts.ScrollBy, C3.Plugins.NinePatch.Acts.SetInstanceVar, C3.Plugins.System.Exps.callmapped, C3.Behaviors.aekiro_gridView.Cnds.OnRender, C3.Plugins.Arr.Acts.Clear, C3.Plugins.Spritefont2.Acts.SetScale, C3.Plugins.AJAX.Cnds.OnComplete, C3.Plugins.AJAX.Exps.LastData, C3.Plugins.Sprite.Cnds.IsOverlapping, C3.Behaviors.MoveTo.Cnds.IsMoving, C3.Plugins.System.Cnds.CompareBetween, C3.Behaviors.aekiro_checkbox.Cnds.OnClicked, C3.Behaviors.aekiro_checkbox.Cnds.IsChecked, C3.Plugins.Audio.Cnds.IsTagPlaying, C3.Plugins.Audio.Acts.SetPaused, C3.Behaviors.aekiro_dialog.Acts.Open, C3.Behaviors.aekiro_dialog.Acts.Close, C3.Behaviors.Fade.Acts.RestartFade, C3.Plugins.System.Acts.ResetGlobals, C3.Plugins.System.Acts.RestartLayout, C3.Plugins.TextBox.Cnds.CompareText, C3.Plugins.Massive_Cube_Forge.Exps.decodeb64, C3.Plugins.TextBox.Exps.Text, C3.Plugins.LocalStorage.Acts.GetItem, C3.Plugins.System.Cnds.Every, C3.Plugins.LocalStorage.Cnds.OnItemGet, C3.Plugins.Sparsha_copyclip.Acts.ApiCopy, C3.Plugins.LocalStorage.Exps.ItemValue, C3.Behaviors.aekiro_dialog.Cnds.onDialogOpened, C3.Plugins.CBhash.Cnds.OnHashed, C3.Plugins.Browser.Exps.Domain, C3.Plugins.Massive_Cube_Forge.Exps.MD5, C3.Plugins.LocalStorage.Acts.CheckItemExists, C3.Plugins.Browser.Acts.GoToURL, C3.Plugins.LocalStorage.Cnds.OnItemMissing, C3.ScriptsInEvents.Eloading_Event5_Act1, C3.Plugins.System.Acts.GoToLayout, C3.Plugins.LocalStorage.Cnds.OnItemExists, C3.Plugins.Arr.Acts.JSONLoad, C3.ScriptsInEvents.Eloaddata_Event3_Act19]; } ; self.C3_JsPropNameTable = [{ Monster_Name_Sf: 0 }, { HP_Monster: 0 }, { MapName_Sf: 0 }, { RequireMonster_Sf: 0 }, { GameObject: 0 }, { CoinShop_sf: 0 }, { CoinTotal_sf: 0 }, { DPS_sf: 0 }, { General_Sf: 0 }, { MoveTo: 0 }, { Fade: 0 }, { GoldDrop_Sf: 0 }, { GridViewDataBind: 0 }, { HIRE_Sf: 0 }, { TimeBoss_Sf: 0 }, { Pin: 0 }, { HeroDescriptionDialog_sf: 0 }, { HeroLevel_sf: 0 }, { CoinTop_img: 0 }, { music: 0 }, { NextMap_Btn: 0 }, { Setting_Icon: 0 }, { Skull_Icon: 0 }, { Sound_Icon: 0 }, { pos: 0 }, { posJSON: 0 }, { idHero: 0 }, { Bought: 0 }, { requireLevel: 0 }, { cost: 0 }, { requireSkillUpdate: 0 }, { description: 0 }, { idSkill: 0 }, { upgradeFunction: 0 }, { nameSkill: 0 }, { paramUpgrade: 0 }, { Button: 0 }, { Upgrade_Icon: 0 }, { Achivement_Icon: 0 }, { BorderLeft_Btn: 0 }, { Checkbox: 0 }, { CheckBoxSound_Btn: 0 }, { RadioButton: 0 }, { Tab_Btn: 0 }, { bgMap: 0 }, { BorderGamePad: 0 }, { BorderGamePad2: 0 }, { borderHudTop: 0 }, { level: 0 }, { id: 0 }, { baseDPS: 0 }, { baseClick: 0 }, { baseCost: 0 }, { costFormula: 0 }, { hero: 0 }, { HeroName_sf: 0 }, { currentCost: 0 }, { idHeroJSON: 0 }, { BuyHero_Btn: 0 }, { BgCharacter: 0 }, { Array_Hero: 0 }, { Array_SkillUpgrade: 0 }, { Array_UI_Upgrade: 0 }, { AJAX: 0 }, { JSON: 0 }, { JSON_All: 0 }, { JSON_HeroShop: 0 }, { JSON_Achievement: 0 }, { Array_DataSave: 0 }, { dead: 0 }, { killed: 0 }, { Boss: 0 }, { monster1: 0 }, { monster10: 0 }, { monster11: 0 }, { monster12: 0 }, { monster13: 0 }, { monster14: 0 }, { monster15: 0 }, { monster16: 0 }, { monster17: 0 }, { monster18: 0 }, { monster19: 0 }, { monster2: 0 }, { monster20: 0 }, { monster21: 0 }, { monster22: 0 }, { monster23: 0 }, { monster24: 0 }, { monster25: 0 }, { monster26: 0 }, { monster27: 0 }, { monster28: 0 }, { monster29: 0 }, { monster3: 0 }, { monster30: 0 }, { monster31: 0 }, { monster32: 0 }, { monster33: 0 }, { monster34: 0 }, { monster35: 0 }, { monster36: 0 }, { monster37: 0 }, { monster38: 0 }, { monster39: 0 }, { monster4: 0 }, { monster40: 0 }, { monster41: 0 }, { monster42: 0 }, { monster43: 0 }, { monster44: 0 }, { monster45: 0 }, { monster46: 0 }, { monster47: 0 }, { monster48: 0 }, { monster49: 0 }, { monster5: 0 }, { monster50: 0 }, { monster51: 0 }, { monster52: 0 }, { monster53: 0 }, { monster54: 0 }, { monster55: 0 }, { monster56: 0 }, { monster57: 0 }, { monster58: 0 }, { monster59: 0 }, { monster6: 0 }, { monster60: 0 }, { monster61: 0 }, { monster62: 0 }, { monster63: 0 }, { monster64: 0 }, { monster65: 0 }, { monster66: 0 }, { monster67: 0 }, { monster68: 0 }, { monster69: 0 }, { monster7: 0 }, { monster70: 0 }, { monster71: 0 }, { monster72: 0 }, { monster73: 0 }, { monster74: 0 }, { monster75: 0 }, { monster76: 0 }, { monster77: 0 }, { monster78: 0 }, { monster79: 0 }, { monster8: 0 }, { monster80: 0 }, { monster81: 0 }, { monster82: 0 }, { monster83: 0 }, { monster84: 0 }, { monster85: 0 }, { monster9: 0 }, { template: 0 }, { ProUI: 0 }, { up: 0 }, { Up_Scroll: 0 }, { Bar_Scroll: 0 }, { Bar_Btn: 0 }, { TopHP_monster: 0 }, { borderHP: 0 }, { curValue: 0 }, { maxHP: 0 }, { isBoss: 0 }, { Gold: 0 }, { baseSize: 0 }, { dieSound: 0 }, { Progress: 0 }, { barGreen: 0 }, { UpLevel_Eff: 0 }, { Critical_Click: 0 }, { coinValue: 0 }, { Spline: 0 }, { Timer: 0 }, { CoinDrop: 0 }, { Mapmini_Bg: 0 }, { MapBorder_btn: 0 }, { levelMap: 0 }, { MapLv_Btn: 0 }, { MapLevel_Sf: 0 }, { Prevent: 0 }, { Touch: 0 }, { Mouse: 0 }, { Keyboard: 0 }, { Browser: 0 }, { RadioGroup: 0 }, { MapBtn_RadioGroup: 0 }, { ClickDmg_sf: 0 }, { DmgFly_Sf: 0 }, { CoinShop_img: 0 }, { TabBtn_RadioGroup: 0 }, { GridView: 0 }, { GridViewachivement: 0 }, { ScrollView: 0 }, { GridViewShop: 0 }, { Check_Icon: 0 }, { NewMap_Icon: 0 }, { ToolTip: 0 }, { DialogHero: 0 }, { GridViewMap: 0 }, { FadeBuyBtn: 0 }, { DragDrop: 0 }, { TestWidth: 0 }, { DialogSkill: 0 }, { SkillDescriptionDialog_sf: 0 }, { Clock_Icon: 0 }, { JSON2: 0 }, { MapBtnPanel: 0 }, { DrawingCanvas: 0 }, { Flash: 0 }, { CompleteArea_sf: 0 }, { SkillUpgrade_sf: 0 }, { Audio: 0 }, { EnterMap_Sf: 0 }, { Achivement_sf: 0 }, { Array_Achievement: 0 }, { BgAchivement: 0 }, { DialogAchievement: 0 }, { AchievementDecription_sf: 0 }, { Array_Map_Pos: 0 }, { LocalStorage: 0 }, { CBHash: 0 }, { Setting_Btn: 0 }, { Dialog: 0 }, { Setting_Dialog: 0 }, { CloseIcon: 0 }, { GameSettingBottomtxt: 0 }, { Copyclip: 0 }, { Forge: 0 }, { InputImport: 0 }, { TestSprite: 0 }, { MapBG: 0 }, { Monster_fml: 0 }, { Btn_fml: 0 }, { MapBtn_fml: 0 }, { Family1: 0 }, { MapMember: 0 }, { monsterKilledInMap: 0 }, { requireMonster: 0 }, { st1: 0 }, { urlHome: 0 }, { posMonster: 0 }, { spacingMapBtn: 0 }, { widthCoinTop: 0 }, { posCoinTotal: 0 }, { posDialogHeroX: 0 }, { posCenterMapBtn: 0 }, { posBtnMap: 0 }, { posBtnBuyHero: 0 }, { maxIdMonster: 0 }, { clickPerSecond: 0 }, { timeBoss: 0 }, { currentDPS: 0 }, { hasNewLevel: 0 }, { stringMonster: 0 }, { bossId: 0 }, { widthCoinShopHero: 0 }, { coinImgWidth: 0 }, { COIN_DISSAPEAR: 0 }, { currentMap: 0 }, { soundOn: 0 }, { soundEffect: 0 }, { clickDamage: 0 }, { clickMultiplier: 0 }, { allDpsMultiplier: 0 }, { goldMultiplier: 0 }, { abaddonMultiplier: 0 }, { clickDpsPercent: 0 }, { reachedMap: 0 }, { totalClick: 0 }, { currentCoin: 0 }, { totalGoldReceive: 0 }, { CurrentHero: 0 }, { totalKills: 0 }, { totalBossKills: 0 }, { totalUpgrades: 0 }, { totalHeroLevels: 0 }, { mostClicksPerSecond: 0 }, { idMonster: 0 }, { hpMonster: 0 }, { levelMonster: 0 }, { baseLife: 0 }, { lengthNumber: 0 }, { offsetNumber: 0 }, { remainNumber: 0 }, { returnString: 0 }, { startString: 0 }, { numberFormat: 0 }, { lengthLimit: 0 }, { numberCoin: 0 }, { returnCost: 0 }, { factorMultiply: 0 }, { valueIncrease: 0 }, { param: 0 }, { baseAttack: 0 }, { NameHero: 0 }, { NameSkill2: 0 }, { Description: 0 }, { price: 0 }, { requireSkill: 0 }, { uidSkillIcon: 0 }, { PosY: 0 }, { NameAchieve: 0 }, { uidAchiIcon: 0 }, { currentLevel: 0 }, { baseDps: 0 }, { idHeroJS: 0 }, { shouldShow: 0 }, { stringCoin: 0 }, { direction: 0 }, { distanceMove: 0 }, { dmg: 0 }, { Parameter0: 0 }, { Parameter1: 0 }, { Parameter2: 0 }, { func: 0 }, { mapOneZone: 0 }, { directionCoin: 0 }, { spacing: 0 }, { newMap: 0 }, { tempDPS: 0 }, { FunctionCall: 0 }, { mapFunction: 0 }, { WidthTotal: 0 }, { idUpgrade: 0 }, { testValueNumpad: 0 }, { testValue3: 0 }, { testValueUp: 0 }, { st2: 0 }, { stringDomain: 0 }, { st3: 0 }, { stringData: 0 }]; } "use strict"; { const C3 = self.C3; function unaryminus(n) { return (typeof n === "number" ? -n : n); } function bothNumbers(a, b) { return typeof a === "number" && typeof b === "number"; } function add(l, r) { if (bothNumbers(l, r)) return l + r; else return l; } function subtract(l, r) { if (bothNumbers(l, r)) return l - r; else return l; } function multiply(l, r) { if (bothNumbers(l, r)) return l * r; else return l; } function divide(l, r) { if (bothNumbers(l, r)) return l / r; else return l; } function mod(l, r) { if (bothNumbers(l, r)) return l % r; else return l; } function pow(l, r) { if (bothNumbers(l, r)) return Math.pow(l, r); else return l; } function and(l, r) { if (typeof l === "string" || typeof r === "string") { let lstr, rstr; if (typeof l === "number") lstr = (Math.round(l * 1e10) / 1e10).toString(); else lstr = l; if (typeof r === "number") rstr = (Math.round(r * 1e10) / 1e10).toString(); else rstr = r; return lstr + rstr; } else { return (l && r ? 1 : 0); } } function or(l, r) { if (bothNumbers(l, r)) return (l || r ? 1 : 0); else return l; } self.C3_ExpressionFuncs = [()=>1, p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const v2 = p._GetNode(2).GetVar(); return ()=>(f0(Math.floor((f1() * v2.GetValue()))) + " Click Damage"); } , ()=>0, ()=>"870, 384", ()=>2, ()=>"872, 378", ()=>3, ()=>"855, 375", ()=>4, ()=>"857, 381", ()=>5, ()=>"876, 378", ()=>6, ()=>"893, 417", ()=>7, ()=>"898, 410", ()=>8, ()=>"898, 412", ()=>9, ()=>"895, 415", ()=>10, ()=>11, ()=>"820, 358", ()=>12, ()=>13, ()=>"823, 362", ()=>14, ()=>15, ()=>16, ()=>"849, 574", ()=>17, ()=>"854, 565", ()=>18, ()=>19, ()=>20, ()=>21, ()=>"850, 473", ()=>22, ()=>23, ()=>24, ()=>25, ()=>26, ()=>"868, 332", ()=>27, ()=>28, ()=>"863, 327", ()=>29, ()=>30, ()=>31, ()=>"853, 456", ()=>32, ()=>"860, 457", ()=>33, ()=>34, ()=>35, ()=>36, ()=>"847, 395", ()=>37, ()=>38, ()=>39, ()=>40, ()=>41, ()=>"857, 385", ()=>42, ()=>43, ()=>44, ()=>45, ()=>"[]", ()=>"data", ()=>"", ()=>"heroCostFormula1", ()=>"skill", ()=>"upgradeClickPercent", ()=>"upgradeHeroPercent", ()=>"upgradeEveryonePercent", ()=>"upgradeGoldFoundPercent", ()=>"upgradeAbaddon", ()=>"Import", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(0, 0, 0, 0); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>v0.GetValue(); } , ()=>"bg", ()=>"RequireMonster", p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>and(and(v0.GetValue(), "/"), v1.GetValue()); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(); } , ()=>"HUD", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); const f4 = p._GetNode(4).GetBoundMethod(); const n5 = p._GetNode(5); const v6 = p._GetNode(6).GetVar(); return ()=>(f0(f1(v2.GetValue(), 0, ",")) - ((v3.GetValue() - f4()) * (n5.ExpObject() + v6.GetValue()))); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const v2 = p._GetNode(2).GetVar(); return ()=>f0(f1(v2.GetValue(), 1, ",")); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(((v0.GetValue() - 1) % 45) + 1); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const n2 = p._GetNode(2); const v3 = p._GetNode(3).GetVar(); return ()=>f0(f1(n2.ExpObject((((v3.GetValue() - 1) % 45) + 1)), 0, ",")); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const n2 = p._GetNode(2); const v3 = p._GetNode(3).GetVar(); return ()=>f0(f1(n2.ExpObject((((v3.GetValue() - 1) % 45) + 1)), 1, ",")); } , ()=>"ANIMATION_HANDLE", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() % 5); } , ()=>"TimerBoss", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>and(v0.GetValue(), " sec"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const f2 = p._GetNode(2).GetBoundMethod(); const f3 = p._GetNode(3).GetBoundMethod(); const v4 = p._GetNode(4).GetVar(); return ()=>f0(v1.GetValue(), Math.floor(f2(f3(v4.GetValue(), ","))), ","); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const f2 = p._GetNode(2).GetBoundMethod(); const v3 = p._GetNode(3).GetVar(); const v4 = p._GetNode(4).GetVar(); return ()=>((((v0.GetValue()) > (v1.GetValue()) ? 1 : 0)) ? (Math.floor(f2(v3.GetValue()))) : (v4.GetValue())); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>((((v0.GetValue()) === (1) ? 1 : 0)) ? (v1.GetValue()) : (v2.GetValue())); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("monsters.", v1.GetValue()) + ".baseLife")); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>((((v0.GetValue()) <= (0) ? 1 : 0)) ? (10) : (v1.GetValue())); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>and("monster", v0.GetValue()); } , ()=>"Game", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const v2 = p._GetNode(2).GetVar(); return ()=>f0(f1(v2.GetValue(), 0, ",")); } , ()=>100, p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("monsters.", v1.GetValue()) + ".baseSize")); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("monsters.", v1.GetValue()) + ".dieSoundId")); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>Math.ceil(((v0.GetValue() / 15) * v1.GetValue())); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); const n2 = p._GetNode(2); return ()=>((((n0.ExpInstVar()) === (0) ? 1 : 0)) ? ("Dead") : ((f1(Math.floor(n2.ExpInstVar())) + " HP"))); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>and(and(n0.ExpObject((and("monsters.", v1.GetValue()) + ".name")), ", Lvl "), v2.GetValue()); } , ()=>"dmg", ()=>"idle", ()=>"died", ()=>"Drop", ()=>"Effect", p=>{ const n0 = p._GetNode(0); return ()=>(and("+ ", Math.floor(n0.ExpInstVar())) + " Gold"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpObject() - 50); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpInstVar(); } , ()=>"gold", ()=>"totalGold", ()=>"effect", ()=>"TOUCH_CTRL", ()=>"Setting", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>Math.floor((f0() * v1.GetValue())); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>(f0() * v1.GetValue()); } , ()=>"totalClicks", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>and("hit", f0(1, 2, 3)); } , ()=>"TAB_HANDLE", ()=>"TabAchivements", ()=>"AchivementTab", ()=>"HeroTab", ()=>"BarScroll", ()=>"SubHeroTab", p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(""); } , ()=>"HEALTH_BAR", ()=>"AdjustHSL", p=>{ const n0 = p._GetNode(0); return ()=>((n0.ExpObject() / 139) * 30); } , ()=>"FUNCTION", ()=>"FORMAT", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>Math.floor(v0.GetValue()); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0((v1.GetValue()).toString()); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>Math.floor((v0.GetValue() / 3)); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>f0(v1.GetValue(), (v2.GetValue() % 3)); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); return ()=>f0(v1.GetValue(), (v2.GetValue() - (v3.GetValue() % 3))); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue()); } , p=>{ const v0 = p._GetNode(0).GetVar(); const f1 = p._GetNode(1).GetBoundMethod(); const v2 = p._GetNode(2).GetVar(); return ()=>((v0.GetValue() + ",") + f1(v2.GetValue(), 3)); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>f0(v1.GetValue(), (v2.GetValue() - 3)); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "K"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "M"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "B"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "T"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "q"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "Q"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "s"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + "S"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(Math.floor(((v0.GetValue() - 1) / 3)) + 1); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); return ()=>f0(v1.GetValue(), (((((v2.GetValue() % 3)) === (0) ? 1 : 0)) ? (3) : ((v3.GetValue() % 3)))); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); const v4 = p._GetNode(4).GetVar(); return ()=>f0(v1.GetValue(), (((((v2.GetValue() - (v3.GetValue() % 3))) === (0) ? 1 : 0)) ? (3) : ((v4.GetValue() % 3)))); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue()).toString(); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); const v4 = p._GetNode(4).GetVar(); return ()=>(f0(v1.GetValue(), ((((v2.GetValue()) < (3) ? 1 : 0)) ? (v3.GetValue()) : (3))) + v4.GetValue()); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); const v4 = p._GetNode(4).GetVar(); return ()=>((f0(v1.GetValue(), ((((v2.GetValue()) < (3) ? 1 : 0)) ? (v3.GetValue()) : (3))) + ",") + v4.GetValue()); } , ()=>"FORMULAR", p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); return ()=>Math.floor(((v0.GetValue() + v1.GetValue()) * Math.pow(v2.GetValue(), v3.GetValue()))); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>Math.floor((20 * Math.pow(v0.GetValue(), v1.GetValue()))); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>Math.floor((v0.GetValue() * Math.pow(v1.GetValue(), v2.GetValue()))); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>(v0.GetValue() * (1 + (v1.GetValue() / 100))); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue(), 0, ","); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue(), 1, ","); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const n2 = p._GetNode(2); const v3 = p._GetNode(3).GetVar(); return ()=>((((n0.ExpObject(v1.GetValue(), 2)) <= (0) ? 1 : 0)) ? (1) : (n2.ExpObject(v3.GetValue(), 2))); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const n2 = p._GetNode(2); const v3 = p._GetNode(3).GetVar(); const v4 = p._GetNode(4).GetVar(); return ()=>add(n0.ExpObject(v1.GetValue(), 2), multiply(n2.ExpObject(v3.GetValue(), 2), (v4.GetValue() / 100))); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>(v0.GetValue() * v1.GetValue()); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const v3 = p._GetNode(3).GetVar(); return ()=>(Math.floor((v0.GetValue() + v1.GetValue())) * Math.pow(v2.GetValue(), v3.GetValue())); } , ()=>"DIALOG", p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject((and("heroes.", n1.ExpInstVar()) + ".name")); } , p=>{ const n0 = p._GetNode(0); return ()=>(("[scale=0.5]" + n0.ExpInstVar()) + "[/scale]"); } , ()=>"\n", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); return ()=>(("[color=#FFFB59 ] Cost " + f0(n1.ExpInstVar())) + " Gold[/color]"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); const v2 = p._GetNode(2).GetVar(); return ()=>f0(n1.ExpObject((and("heroes.", v2.GetValue()) + ".baseClickDamage"))); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("heroes.", v1.GetValue()) + ".description")); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject(n1.ExpInstVar()); } , p=>{ const v0 = p._GetNode(0).GetVar(); const n1 = p._GetNode(1); const n2 = p._GetNode(2); return ()=>(and((("[color=#F42D20] Requires " + v0.GetValue()) + "'s upgrade: "), n1.ExpObject((and("upgrades.", n2.ExpInstVar()) + ".name"))) + "[/color]"); } , p=>{ const n0 = p._GetNode(0); return ()=>(and("[color=#F42D20] Requires hero level: ", n0.ExpInstVar()) + "[/color]"); } , p=>{ const v0 = p._GetNode(0).GetVar(); const n1 = p._GetNode(1); return ()=>(((("Increases [color=#33F178] " + v0.GetValue()) + "[/color]'s Click Damage by [color=#33F178] ") + n1.ExpInstVar()) + "[/color] %."); } , p=>{ const v0 = p._GetNode(0).GetVar(); const f1 = p._GetNode(1).GetBoundMethod(); const n2 = p._GetNode(2); return ()=>(((("Increases [color=#33F178] " + v0.GetValue()) + "[/color]'s DPS by [color=#33F178]") + f1(n2.ExpInstVar(), 1, ",")) + "[/color] %."); } , p=>{ const n0 = p._GetNode(0); return ()=>(("[color=#999999]" + n0.ExpInstVar()) + "[/color]"); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpObject() + 20); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); const f2 = p._GetNode(2).GetBoundMethod(); const f3 = p._GetNode(3).GetBoundMethod(); const n4 = p._GetNode(4); const n5 = p._GetNode(5); return ()=>(((((n0.ExpObject() + n1.ExpObject())) > (f2(0)) ? 1 : 0)) ? ((f3(0) - n4.ExpObject())) : (n5.ExpObject())); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpObject() + 10); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject((and("achievements.", n1.ExpObject()) + ".name")); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject((and("achievements.", n1.ExpObject()) + ".description")); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject((and("achievements.", n1.ExpObject()) + ".checkParams")); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(("[scale=0.5]" + v0.GetValue()) + "[/scale]"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); const f3 = p._GetNode(3).GetBoundMethod(); const v4 = p._GetNode(4).GetVar(); return ()=>((f0(v1.GetValue(), 0, "%1") + v2.GetValue()) + f3(v4.GetValue(), 1, "%1")); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpObject() + 50); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("heroes.", v1.GetValue()) + ".name")); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject(v1.GetValue()); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); const v2 = p._GetNode(2).GetVar(); return ()=>f0(n1.ExpObject((and("heroes.", v2.GetValue()) + ".baseAttack"))); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(and("[color=#00ff00]Click Damage: ", (v0.GetValue() + 1)) + "[/color]"); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>and("Current Level:\n Click Damage: ", ((v0.GetValue() * v1.GetValue()) + 1)); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>(and("[color=#00ff00]Next Level:[/color]\n[color=#00ff00] Click Damage: ", ((v0.GetValue() * (v1.GetValue() + 1)) + 1)) + "[/color]"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>(("[color=#00ff00]DPS: " + f0(Math.floor(v1.GetValue()))) + "[/color]"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>("Current Level:\n DPS: " + f0(Math.floor((v1.GetValue() * v2.GetValue())))); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>(("[color=#00ff00]Next Level:[/color]\n[color=#00ff00] DPS: " + f0(Math.floor((v1.GetValue() * (v2.GetValue() + 1))))) + "[/color]"); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(("[color=#999999]" + v0.GetValue()) + "[/color]"); } , ()=>"hideHero", p=>{ const v0 = p._GetNode(0).GetVar(); const n1 = p._GetNode(1); const f2 = p._GetNode(2).GetBoundMethod(); const f3 = p._GetNode(3).GetBoundMethod(); const n4 = p._GetNode(4); const v5 = p._GetNode(5).GetVar(); return ()=>(((((v0.GetValue() + n1.ExpObject())) > (f2(0)) ? 1 : 0)) ? ((f3(0) - n4.ExpObject())) : (v5.GetValue())); } , ()=>"CHECK_COIN", p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("heroes.", v1.GetValue()) + ".baseCost")); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + 1); } , p=>{ const n0 = p._GetNode(0); return ()=>and(".", (n0.ExpObject(".") - 1)); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject(and("heroes.", v1.GetValue())); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior(); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(20, 20, 20, 255); } , ()=>"48, 48, 48", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(255, 255, 255); } , ()=>"255,255,255", p=>{ const v0 = p._GetNode(0).GetVar(); const n1 = p._GetNode(1); const v2 = p._GetNode(2).GetVar(); return ()=>(v0.GetValue() + (((n1.ExpObject() + v2.GetValue()) + 5) / 2)); } , p=>{ const v0 = p._GetNode(0).GetVar(); const n1 = p._GetNode(1); const v2 = p._GetNode(2).GetVar(); return ()=>(v0.GetValue() - (((n1.ExpObject() + v2.GetValue()) + 5) / 2)); } , ()=>"EFFECT", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(50, 90); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>(n0.ExpObject() + (v1.GetValue() * v2.GetValue())); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>(n0.ExpObject() - f1(30, 50)); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>(n0.ExpObject() + ((v1.GetValue() * v2.GetValue()) * 2)); } , ()=>12345, ()=>"ACHIEVEMENT", p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject(and("achievements.", n1.ExpObject())); } , ()=>"achievements", p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".checkFunction"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); return ()=>f0(n1.ExpObject(".checkParams")); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".id"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); return ()=>f0(n1.ExpObject()); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject(("achievements." + n1.ExpObject())); } , ()=>388, ()=>132, p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>and("ACHIEVEMENT: ", n0.ExpObject((("achievements." + n1.ExpObject()) + ".name"))); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(10 * v0.GetValue()); } , ()=>"highestFinishedZone", ()=>"10", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(25 * v0.GetValue()); } , ()=>"25", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(50 * v0.GetValue()); } , ()=>"50", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(100 * v0.GetValue()); } , ()=>"100", ()=>1000, ()=>10000, ()=>50000, ()=>100000, ()=>1000000, ()=>1000000000, ()=>100000000000000, ()=>1000000000000000000, ()=>"totalBossKills", ()=>"totalKills", ()=>500000, ()=>5000000000, ()=>50000000000000, ()=>500000000000000000, ()=>"totalUpgrades", ()=>50, ()=>75, ()=>83, ()=>"maxDps", ()=>1000000000000, ()=>1000000000000000, ()=>"totalHeroLevels", ()=>"mostClicksPerSecond", p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior("id"); } , ()=>-1000, ()=>"OTHER", p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>((((n0.ExpInstVar()) <= (0) ? 1 : 0)) ? (0) : (n1.ExpInstVar())); } , ()=>"Fly", p=>{ const n0 = p._GetNode(0); return ()=>(and("Sound (", n0.ExpInstVar()) + ")"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(1, (-1)); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); return ()=>f0(20, 60); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>(n0.ExpObject() - f1(50, 90)); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>(n0.ExpObject() + f1(30, 80)); } , ()=>861, ()=>265, ()=>"staticData", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); const n2 = p._GetNode(2); const n3 = p._GetNode(3); const n4 = p._GetNode(4); return ()=>f0(((((((n1.ExpObject() + "||") + n2.ExpObject()) + "||") + n3.ExpObject()) + "||") + n4.ExpObject())); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); const v2 = p._GetNode(2).GetVar(); return ()=>((n0.ExpObject() + n1.ExpObject()) + v2.GetValue()); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpInstVar_Family() + 1); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpObject() - 1); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>n0.ExpObject(f1(), 1); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); const n2 = p._GetNode(2); const f3 = p._GetNode(3).GetBoundMethod(); const n4 = p._GetNode(4); const f5 = p._GetNode(5).GetBoundMethod(); return ()=>multiply(n0.ExpObject(f1(), 1), ((((n2.ExpObject(f3(), 2)) <= (0) ? 1 : 0)) ? (1) : (n4.ExpObject(f5(), 2)))); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>(f0(Math.floor(v1.GetValue())) + " DPS"); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>(v0.GetValue() + Math.floor((v1.GetValue() * (v2.GetValue() / 100)))); } , ()=>"SHOP_HANDLE", p=>{ const v0 = p._GetNode(0).GetVar(); const n1 = p._GetNode(1); return ()=>(v0.GetValue() - n1.ExpInstVar()); } , p=>{ const n0 = p._GetNode(0); return ()=>(n0.ExpObject() + 30); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); const n2 = p._GetNode(2); return ()=>add(n0.ExpObject(n1.ExpInstVar(), 1), n2.ExpInstVar()); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>(n0.ExpObject() - (n1.ExpObject() / 2)); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>(v0.GetValue() * ((100 + v1.GetValue()) / 100)); } , ()=>411, ()=>103, p=>{ const n0 = p._GetNode(0); return ()=>(("Gained " + n0.ExpInstVar()) + "!"); } , ()=>-0.1, ()=>0.1, ()=>"GRIDVIEW_CTRL", ()=>"SHOP", p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const n1 = p._GetNode(1); const n2 = p._GetNode(2); const n3 = p._GetNode(3); const n4 = p._GetNode(4); const n5 = p._GetNode(5); return ()=>f0("", n1.ExpBehavior("costFormula"), n2.ExpBehavior("id"), n3.ExpObject(n4.ExpBehavior("id")), n5.ExpBehavior("baseCost")); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>n0.ExpObject(n1.ExpBehavior("id")); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior("baseClickDamage"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior("baseAttack"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior("baseCost"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior("costFormula"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpBehavior("name"); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); return ()=>((((n0.ExpObject(n1.ExpBehavior("id"), 0)) > (0) ? 1 : 0)) ? ("LVL UP ") : ("HIRE")); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); const n2 = p._GetNode(2); const n3 = p._GetNode(3); return ()=>((((n0.ExpObject(n1.ExpBehavior("id"), 0)) > (0) ? 1 : 0)) ? (and("Lvl ", n2.ExpObject(n3.ExpBehavior("id"), 0))) : ("")); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); const n2 = p._GetNode(2); const n3 = p._GetNode(3); const n4 = p._GetNode(4); const n5 = p._GetNode(5); const n6 = p._GetNode(6); return ()=>f0(f1("", n2.ExpInstVar(), n3.ExpInstVar(), n4.ExpObject(n5.ExpInstVar()), n6.ExpInstVar())); } , ()=>0.6, p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>((n0.ExpObject() + v1.GetValue()) + 5); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>(v0.GetValue() - (v1.GetValue() / 2)); } , p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); return ()=>(v0.GetValue() + (v1.GetValue() / 2)); } , ()=>"upgrades", p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".heroId"); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>add(n0.ExpObject(v1.GetValue()), 1); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".iconId"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".cost"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".upgradeFunction"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".upgradeParams"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".name"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".upgradeRequired"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".heroLevelRequired"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(".description"); } , p=>{ const n0 = p._GetNode(0); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>n0.ExpObject(and("heroes.", (f1() + 1))); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>and(and(n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".name")), " Lvl "), v2.GetValue()); } , ()=>853, ()=>290, p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>and((and("Entering ", n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".name"))) + " Lvl "), v2.GetValue()); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".bossId")); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".monsterIds")); } , p=>{ const n0 = p._GetNode(0); const v1 = p._GetNode(1).GetVar(); return ()=>subtract(n0.ExpObject((and("zones.", ((Math.floor(((v1.GetValue() - 1) / 5)) % 9) + 1)) + ".background")), 1); } , ()=>"MAP_CTRL", p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); const f2 = p._GetNode(2).GetBoundMethod(); const f3 = p._GetNode(3).GetBoundMethod(); const v4 = p._GetNode(4).GetVar(); return ()=>(n0.ExpObject() + ((-n1.ExpObject()) + f2(f3(v4.GetValue(), 0, ",")))); } , ()=>"MapBack", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() - 5); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + 5); } , ()=>"MapNext", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() - 10); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() + 10); } , p=>{ const n0 = p._GetNode(0); const n1 = p._GetNode(1); const v2 = p._GetNode(2).GetVar(); return ()=>((n0.ExpObject() - n1.ExpObject()) - v2.GetValue()); } , ()=>"SETTING", ()=>"MusicBtn", ()=>"EffSoundBtn", ()=>"SettingBtn", ()=>"CloseSettingBtn", ()=>"SaveBtn", ()=>"Game saved!", ()=>"ResetBtn", ()=>"Game reset!", ()=>"ImportBtn", ()=>"ImportDataBtn", ()=>"ExportBtn", ()=>"TICK", p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() / 10); } , p=>{ const v0 = p._GetNode(0).GetVar(); return ()=>(v0.GetValue() - 0.1); } , ()=>"Game data copied to Clipboard. Paste it in a notepad to save!", p=>{ const v0 = p._GetNode(0).GetVar(); const v1 = p._GetNode(1).GetVar(); const v2 = p._GetNode(2).GetVar(); return ()=>((v0.GetValue() + v1.GetValue()) + v2.GetValue()); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>f0(f1(), "||"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const f1 = p._GetNode(1).GetBoundMethod(); return ()=>f0(f1()); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue(), 0, "||"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue(), 1, "||"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue(), 2, "||"); } , p=>{ const f0 = p._GetNode(0).GetBoundMethod(); const v1 = p._GetNode(1).GetVar(); return ()=>f0(v1.GetValue(), 3, "||"); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(0); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(1); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(2); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(3); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(4); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(5); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(6); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(7); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(8); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(9); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(10); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(11); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(12); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(13); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(14); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(15); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(16); } , p=>{ const n0 = p._GetNode(0); return ()=>n0.ExpObject(17); } ]; } "use strict"; { const scriptsInEvents = { async Egame_Event1_Act5(runtime, localVars) { Hideloading(); }, async Egame_Event16_Act9(runtime, localVars) { localVars.hpMonster = monsterLifeFormula1(localVars.levelMonster, localVars.baseLife, localVars.isBoss) }, async Egame_Event65_Act1(runtime, localVars) { localVars.returnString = format_number_limit(localVars.numberFormat, 5); }, async Egame_Event67_Act3(runtime, localVars) { localVars.star = runtime.globalVars.currentCoin.toLocaleString('fullwide', { useGrouping: false }); }, async Egame_Event193_Act1(runtime, localVars) { localVars.stringCoin = format_number_limit(runtime.globalVars.currentCoin, 15); }, async Eloading_Event5_Act1(runtime, localVars) { Hideloading(); }, async Eloaddata_Event3_Act19(runtime, localVars) { Hideloading(); } }; self.C3.ScriptsInEvents = scriptsInEvents; } function monsterLifeFormula1(levelMonster, baseLife, isBoss) { var hpCalculation; var levelFactor; levelFactor = 0; if (isBoss) { levelFactor = Math.pow(1.6, levelMonster - 1); hpCalculation = 10 * (baseLife * levelFactor) + (levelMonster - 1) * 10; } else { levelFactor = Math.pow(1.6, levelMonster - 1); hpCalculation = baseLife * levelFactor + (levelMonster - 1) * 10; } return Math.ceil(hpCalculation); } function upgradeClickPercent(clickPercent) { var a = clickPercent; this.clickMultiplier = this.clickMultiplier * (1 + a / 100); } let array_number_view = ["", "K", "M", "B", "T", "q", "Q", "s", "S", "O", "N", "d", "U", "D", "Z"] function format_number_limit(value_input, limit) { var number_input = Math.floor(value_input).toLocaleString('fullwide', { useGrouping: false }); var show_length_number = number_input.length; var count_unit = 0; while (show_length_number > limit) { show_length_number = show_length_number - 3; count_unit = count_unit + 1; } var returnvalue = format_number(number_input.substring(0, show_length_number)) + array_number_view[count_unit]; return returnvalue; } function format_number(num) { return num.replace(/(?